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中的for 循环
Jun 09 Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 Python
详解Python开发中如何使用Hook技巧
Nov 01 Python
Python 使用with上下文实现计时功能
Mar 09 Python
Python中的函数作用域
May 07 Python
解决Python网页爬虫之中文乱码问题
May 11 Python
利用Python进行数据可视化常见的9种方法!超实用!
Jul 11 Python
在Python中使用Neo4j的方法
Mar 14 Python
django表单的Widgets使用详解
Jul 22 Python
详解Python self 参数
Aug 30 Python
python如何使用jt400.jar包代码实例
Dec 20 Python
使用pyplot.matshow()函数添加绘图标题
Jun 16 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
用PHP将数据导入到Foxmail的实现代码
2010/09/05 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
2014/09/16 PHP
PHP批量查询WordPress留言者E-mail地址实现方法
2015/02/15 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
firefox插件Firebug的使用教程
2010/01/02 Javascript
JavaScript组合拼接字符串的效率对比测试
2014/11/06 Javascript
JS实现跟随鼠标闪烁转动色块的方法
2015/02/26 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
基于JavaScript 实现拖放功能
2019/09/12 Javascript
layui点击弹框页面 表单请求的方法
2019/09/21 Javascript
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
python登录并爬取淘宝信息代码示例
2017/12/09 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
Python读写文件模式和文件对象方法实例详解
2019/09/17 Python
python二维键值数组生成转json的例子
2019/12/06 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
2021/01/27 Python
HTML5 SEO优化的一些建议
2020/08/27 HTML / CSS
Kathmandu澳洲户外商店:新西兰户外运动品牌
2017/11/12 全球购物
高一数学教学反思
2014/02/07 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
JPA如何使用entityManager执行SQL并指定返回类型
2021/06/15 Java/Android
Java常用函数式接口总结
2021/06/29 Java/Android
Linux系统下MySQL配置主从分离的步骤
2022/03/21 MySQL
Nginx安装配置详解
2022/06/25 Servers
JavaScript实现九宫格拖拽效果
2022/06/28 Javascript