- 第一步: 创建blog应用
- 第二步: 编写models.py模型文件
- 第三步: 使用orm进行多对多增删改查操作
- 添加关联关系
- 通过关联字段查询所有关联对象
- 移除关联关系
- 更新关联关系
- 总结
第一步: 创建blog应用
在任意项目中创建一个博客(blog)应用来练习Django中多对多关系的使用。
python manage.py startapp blog
创建完在setting中注册blog应用,不然进行模型迁移会出错。
INSTALLED_APPS = [ ...... 'blog' ]
创建完应用后画个简单E-R图看一下博客项目中用到多对多关系的地方, 一个用户可以收藏多篇文章, 一篇文章可以被多个用户收藏。
在普通项目中一般通过中间表的形式在两个或多个模型之间建立多对多关联关系, 而在Django项目中通过给模型类添加多对多关联字段的方式, 建立模型之间的多对多关联关系。
第二步: 编写models.py模型文件其中主要用到了models.ManyToManyField(to)这个api, 其中to参数用来指定关联类型, 下面来写一下blog应用的models.py文件。
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100, verbose_name='文章标题')
class Meta:
db_table = 'article'
verbose_name = '文章'
# 因为在博客项目中, 每个用户都是作者, 所以这里用author来表示用户
class Author(models.Model):
username = models.CharField(max_length=30, verbose_name='用户名')
articles_collected = models.ManyToManyField(to=Article, verbose_name='收藏的文章')
class Meta:
db_table = 'author'
verbose_name = '作者'
执行makemigrations和migrate对模型进行迁移。
python manage.py makemigrations blog
python manage.py migrate blog
生成后看一下下图效果, 可以看到作者模型类中定义的articles_collected字段并没有出现在作者表中, 而是自动生成了一张表名为模型类名小写_关联字段的表, 其中存储了两个模型的id。
在控制台输入以下命令, 进入Django的shell交互环境进行测试。
python manage.py shell
进入shell环境后, 导入blog应用的models模块
from blog.models import *添加关联关系
# 创建一个用户 author = Author.objects.create(username='张三') # 创建两篇文章 article1 = Article.objects.create(title='小红帽') article2 = Article.objects.create(title='大灰狼') # 对象.关联字段.add()方法用来添加关联关系 author.articles_collected.add(1) # 可以是文章的id author.articles_collected.add(article2) # 也可以是对应的文章对象
查看一下效果, 可以看到两种方法都可以添加成功。
对象.关联字段.all()用来查询所有关联的对象。
author.articles_collected.all()
QuerySet中包含了作者收藏的两篇文章。
对象.关联字段.remove()用来移除关联关系, 和add()一样也是可以使用id或者对象作为参数。
author.articles_collected.remove(1) author.articles_collected.remove(article2)
执行完后重新查询一下, 用户收藏的文章, 可以看到收藏的两篇文章都已经移除了。
对象.关联字段.set()可以用来添加 修改 清空操作, 接收一个列表作为参数, 列表中可以是文章对象也可以是文章id。
author.articles_collected.set([article1,2])
每次调用set()都是进行的修改操作。
author.articles_collected.set([2])
如果参数为一个空列表, 则清空关联关系。
author.articles_collected.set([])总结
add()适用于在原有基础上添加关联关系
remove()从当前关联关系中移除一个关联关系
set()用来设置关联关系, 可以用来进行修改操作



