Django-orm多对多增删改查


第一步: 创建blog应用

在任意项目中创建一个博客(blog)应用来练习Django中多对多关系的使用。

python manage.py startapp blog

创建完在setting中注册blog应用,不然进行模型迁移会出错。

INSTALLED_APPS = [
	......
	'blog'
]

创建完应用后画个简单E-R图看一下博客项目中用到多对多关系的地方, 一个用户可以收藏多篇文章, 一篇文章可以被多个用户收藏
用户和文章的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 = '作者'

执行makemigrationsmigrate对模型进行迁移

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()用来设置关联关系, 可以用来进行修改操作

猜你喜欢

转载自blog.csdn.net/qq_45458749/article/details/125035096