Django ORM多对多查询方法(自定义第三张表&ManyToManyField)


Posted in Python onAugust 09, 2019

对于多对多表

- 1.自定义第三张表,更加灵活

- 2.ManyToManyField 自动生成第3张表 只能 有3列数据 不能自己添加。

自定义第三张表

# models.py

class Boy(models.Model):
  name = models.CharField(max_length=32)

class Girl(models.Model):
  name = models.CharField(max_length=32)


class Love(models.Model):
  b = models.ForeignKey('Boy')
  g = models.ForeignKey('Girl')

  # 创建联合唯一索引
  # class Meta:
  #   unique_together = [
  #     ('b','g'),
  #   ]




# views.py

def test(request):
  # objs = [
  #   models.Boy(name='summer'),
  #   models.Boy(name='spring'),
  #   models.Boy(name='autumn'),
  # ]
  # models.Boy.objects.bulk_create(objs,5)

  # objs = [
  #   models.Girl(name='小于'),
  #   models.Girl(name='小秋'),
  #   models.Girl(name='小夏'),
  # ]
  # models.Girl.objects.bulk_create(objs,5)

# 查询和girl小于有关系的boy

# 1 通过girl表进行反向查找
  obj = models.Girl.objects.filter(name='小于').first().love_set.all()
  # obj = models.Girl.objects.filter(name='小于').first().love_set.select_related('b').all()
  for i in obj:
    print(i.b.name)




  print(' '.center(60,'='))



# 2 通过Love表进行查找

  obj = models.Love.objects.filter(g__name='小于').all()
  for i in obj:
    print(i.b.name)

  # 这样进行查询性能不好,需要重新发sql请求在进行查询另外一张表中的数据

  boy_list = models.Love.objects.filter(g__name='小于').values('b__name')
  for i in boy_list:
    print(i['b__name'])

  # 这样 进行了 优化 不会重复发送sql请求,查询到的结果内是字典

  boy_obj = models.Love.objects.filter(g__name='小于').select_related('b').all()
  for i in boy_obj:
    print(i.b.name)
  # select_related('ut') 相当 于 inner join 先连成一张表再进行查询

  return HttpResponse('insert ok ....')

ManyToManyField

# models.py
from django.db import models

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

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

# views.py

def test(request):
  # objs = [
  #   models.Boy(name='summer'),
  #   models.Boy(name='spring'),
  #   models.Boy(name='autumn'),
  # ]
  # models.Boy.objects.bulk_create(objs,5)

  # objs = [
  #   models.Girl(name='小于'),
  #   models.Girl(name='小秋'),
  #   models.Girl(name='小夏'),
  # ]
  # models.Girl.objects.bulk_create(objs,5)


  # ManyToManyField

  obj = models.Girl.objects.filter(name='小秋').first()

  # 增
  # obj.m.add(3)
  # obj.m.add(3,4)
  # obj.m.add(*[1,2])

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

  # 改
  # obj.m.set([1,2,])

  # boy_obj = obj.m.all()
  # for row in boy_obj:
  #   print(row.id,row.name)
  # 清除
  # obj.m.clear()


  # 反向查 在没有 ManyToManyField 字段的表中查
  obj = models.Boy.objects.filter(name='summer').first()
  girl_obj = obj.girl_set.all()
  # 增删改查
  obj.girl_set.set([1,2,3])

  for row in girl_list:
    print(row.id,row.name)

  return HttpResponse('ok')

杂交(自定义第三张表+ManyToManyField)

# modles.py
class Boy(models.Model):
  name = models.CharField(max_length=32)

class Girl(models.Model):
  name = models.CharField(max_length=32)
  m = models.ManyToManyField('Boy',through='Love',through_fields=('b','g')) # 只让其生成3张表,如果不加后面产生生成4张表

class Love(models.Model):
  b = models.ForeignKey('Boy')
  g = models.ForeignKey('Girl')

# views.py
def test(request):
  obj = models.Girl.objects.filter(name='小于').first()
  # obj.m.add(1) # 不行
  # obj.m.remove(1) # 不行
  # obj.m.set([1,2]) # 不行
  # obj.m.clear() # 可以
  # obj.m.all() # 可以

  # 杂交的方法对获取查询方便点,还添加了清空功能

  boy_obj = obj.m.all()

  for i in boy_obj:
    print(i.name)

以上这篇Django ORM多对多查询方法(自定义第三张表&ManyToManyField)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python中使用异步Socket编程性能测试
Jun 25 Python
Python中使用select模块实现非阻塞的IO
Feb 03 Python
在Python的Django框架中使用通用视图的方法
Jul 21 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
Jun 02 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
Feb 07 Python
Python反射和内置方法重写操作详解
Aug 27 Python
Python调用C语言的实现
Jul 26 Python
djano一对一、多对多、分页实例代码
Aug 16 Python
postman传递当前时间戳实例详解
Sep 14 Python
详解python内置常用高阶函数(列出了5个常用的)
Feb 21 Python
Django跨域资源共享问题(推荐)
Mar 09 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 Python
Django使用Jinja2模板引擎的示例代码
Aug 09 #Python
在Django admin中编辑ManyToManyField的实现方法
Aug 09 #Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 #Python
python实现网站用户名密码自动登录功能
Aug 09 #Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
Aug 09 #Python
ORM Django 终端打印 SQL 语句实现解析
Aug 09 #Python
python实现读取excel文件中所有sheet操作示例
Aug 09 #Python
You might like
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
PHP中抽象类和抽象方法概念与用法分析
2016/05/24 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
因str_replace导致的注入问题总结
2019/08/08 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
jQuery带箭头提示框tooltips插件集锦
2014/11/17 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
2015/11/25 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
js图片查看器插件用法示例
2019/06/22 Javascript
如何在项目中使用log4.js的方法步骤
2019/07/16 Javascript
微信小程序整个页面的自动适应布局的实现
2020/07/12 Javascript
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
Python本地与全局命名空间用法实例
2015/06/16 Python
python2和python3实现在图片上加汉字的方法
2019/08/22 Python
python3中rank函数的用法
2019/11/27 Python
python绘图模块之利用turtle画图
2021/02/12 Python
AmazeUI 评论列表的实现示例
2020/08/13 HTML / CSS
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
年级组长自我鉴定
2014/02/22 职场文书
诚信考试倡议书
2014/04/15 职场文书
活动总结怎么写啊
2014/05/07 职场文书
公安机关纪律作风整顿剖析
2014/10/10 职场文书
2015元旦标语横幅
2014/12/09 职场文书
网站文案策划岗位职责
2015/04/14 职场文书
加薪通知
2015/04/25 职场文书
任长霞观后感
2015/06/16 职场文书
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python