文章目录
第一步: 创建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
。
第三步: 使用orm进行多对多增删改查操作
在控制台输入以下命令
, 进入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()
用来设置
关联关系, 可以用来进行修改操作