栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Django-模型多对多关联关系(ManyToMany)的使用

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django-模型多对多关联关系(ManyToMany)的使用

文章目录
  • 第一步: 创建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。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/934958.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号