一. 新建model

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 = '作者'

迁移完成后,会生成三张表。 可以看到作者模型类中定义的articles_collected字段并没有出现在作者表中, 而是自动生成了一张表名为模型类名小写_关联字段的表, 其中存储了两个模型的id

二. 使用orm进行多对多增删改查

1.添加关联关系

# 创建一个用户
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) # 也可以是对应的文章对象

2.通过关联字段articles_collected查询所有关联对象

对象.关联字段.all()用来查询所有关联的对象。

>>>author.articles_collected.all()
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>]>

3.移除关联关系

对象.关联字段.remove()用来移除关联关系, 和add()一样也是可以使用id或者对象作为参数

author.articles_collected.remove(1)
author.articles_collected.remove(article2)
#执行完后重新查询一下, 用户收藏的文章, 可以看到收藏的两篇文章都已经移除了
>>> author.articles_collected.all()            
<QuerySet []>

4.更新关联关系

对象.关联字段.set()可用来执行添加,修改,清空操作,接收一个列表作为参数,列表中可以是文章对象,也可以是文章id

#修改关联关系,使只有文章id=2
author.articles_collected.set([2])
>>> author.articles_collected.all()    
<QuerySet [<Article: Article object (2)>]>

#修改内容为空,参数为空列表时,则清空关联关系
author.articles_collected.set([])
>>> author.articles_collected.all()            
<QuerySet []>

#添加关联关系
author.articles_collected.set([article1,2])
>>> author.articles_collected.all()             
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>]>

参考:https://blog.csdn.net/qq_45458749/article/details/125035096

原文地址:http://www.cnblogs.com/regit/p/16827441.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性