专栏首页数据云团Django进阶-8-ORM多对多

Django进阶-8-ORM多对多

多对多关系表

  • 找到该对象;
  • 通过该对象,反向操作,找到第三张关系表;
  • 通过第三张关系表,正向操作,找到和该对象有关系的对象;
  • 只要对象 1 和对象 2 中间有关系表建立了关系;对象 1 反向操作到关系表,关系表正向操作到对象 2。

Django ORM 中一个类名对应一张表,要想操作表就 models.类 直接操作那张表。如果使用 ManyToManyField 字段生成“第三张”关系表,可以通过单个 obj 对象 间接操作。

class Boy(models.Model):
    name = models.CharField(max_length=32)
    m = models.ManyToManyField('Girl',through="Love",through_fields=('b','g',))


class Girl(models.Model):
    nick = models.CharField(max_length=32)
    m = models.ManyToManyField('Boy')

① 正向操作

obj.m.all()

obj = models.Boy.objects.filter(name='Bob').first()
print(obj.id,obj.name)
obj.m.add(2)
obj.m.add(2,4)
obj.m.add(*[1,])

obj.m.remove(1)
obj.m.remove(2,3)
obj.m.remove(*[4,])

obj.m.set([1,])

q = obj.m.all()
# [Girl对象]
print(q)
obj = models.Boy.objects.filter(name='Bob').first()
girl_list = obj.m.all()

obj = models.Boy.objects.filter(name='Bob').first()
girl_list = obj.m.all()
girl_list = obj.m.filter(nick='Tom')
print(girl_list)

obj = models.Boy.objects.filter(name='Bob').first()
obj.m.clear()

②反向操作

obj.小写的表名_set

多对多和外键跨表一样都是 小写的表名_set

本文分享自微信公众号 - 数据云团(SmartData),作者:云团小楠

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Django进阶-9-ORM分组与聚合查询

    prefetch_related:不做连表,多次单表查询外键表 ,去重之后显示, 2次单表查询(有几个外键做几次1+N次单表查询)

    小团子
  • Django实战-信息资讯-自定义模板标签

    Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(...

    小团子
  • 框架篇-Django博客应用-权限控制

    然后让 BlogPublishView 和 BlogEditView 类继承 AdminRequiredMixin即可。

    小团子
  • [探索]怎样让 JS - API 具有更好的实用性

    在上家公司开发后台管理系统的时候,频繁要处理各种数据显示的问题,一开始是实现就好。后来写多了,自己看得也难受了。就想着怎么优化代码和复用了。下面就通过一个简单的...

    守候i
  • 原生JS的Ajax

          非IE6浏览器:var obj = new XMLHttpReuqest();

    莫问今朝
  • GC算法-标记压缩算法

    还记得标记清除和复制算法的问题么? 堆使用效率低和碎片化问题. 那么有没有能够利用整个堆, 有没有内存碎片化问题的算法呢? 这就是标记压缩算法了.

    烟草的香味
  • JavaScript 对象

    JavaScript 中的所有事物都是对象:字符串、数值、数组、函数… 对象创建 var obj = Object.create({x:1}); 属性 obj....

    康怀帅
  • 32.Django form组件

    Form组件  Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面...

    zhang_derek
  • C# 使用dynamic类型来访问JObject对象

    dynamic是C#里面的动态类型,可在未知类型的情况访问对应的属性,非常灵活和方便。

    Mr. Wei
  • 用图片代替提交和重置按钮

    为了整个界面美观,我们需要对提交和重置按钮美化一番,可是无论用什么CSS样式定义按钮,都很难达到满意的效果,只得用JS+图片的方式进行处理,下边我是总结出的三种...

    幽鸿

扫码关注云+社区

领取腾讯云代金券