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线程指南详细介绍
Jan 05 Python
python读取和保存视频文件
Apr 16 Python
Python实现统计给定字符串中重复模式最高子串功能示例
May 16 Python
pytorch对可变长度序列的处理方法详解
Dec 08 Python
python钉钉机器人运维脚本监控实例
Feb 20 Python
使用Python实现跳一跳自动跳跃功能
Jul 10 Python
利用Python复制文件的9种方法总结
Sep 02 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
Feb 29 Python
keras多显卡训练方式
Jun 10 Python
python实现数字炸弹游戏
Jul 17 Python
python 检测nginx服务邮件报警的脚本
Dec 31 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
Mar 04 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中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
PHP使用数组依次替换字符串中匹配项
2016/01/08 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
javascript 装载iframe子页面,自适应高度
2009/03/20 Javascript
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
JS按位非(~)运算符与~~运算符的理解分析
2011/07/31 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
基于JavaScript操作DOM常用的API小结
2015/12/01 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
JS动态计算移动端rem的解决方案
2016/10/14 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
antd design table更改某行数据的样式操作
2020/10/31 Javascript
[55:48]VGJ.S vs TNC Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python中的random()方法的使用介绍
2015/05/15 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
Python3.5运算符操作实例详解
2019/04/25 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
前端面试必备之CSS3的新特性
2017/09/05 HTML / CSS
索尼巴西商店:Sony巴西
2019/06/21 全球购物
美国豪华的多品牌精品店:The Webster
2019/07/31 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
教育学习自我评价
2014/02/03 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
活动总结格式
2014/08/30 职场文书
求职自我评价怎么写
2015/03/09 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
MySQL时区造成时差问题
2022/04/13 MySQL
分享几个实用的CSS代码块
2022/06/10 HTML / CSS
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android