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读取ini文件、操作mysql、发送邮件实例
Jan 01 Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 Python
caffe binaryproto 与 npy相互转换的实例讲解
Jul 09 Python
Python第三方Window模块文件的几种安装方法
Nov 22 Python
在python tkinter中Canvas实现进度条显示的方法
Jun 14 Python
利用Python实现手机短信监控通知的方法
Jul 22 Python
利用anaconda作为python的依赖库管理方法
Aug 13 Python
python-tornado的接口用swagger进行包装的实例
Aug 29 Python
ipad上运行python的方法步骤
Oct 12 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
May 08 Python
Python之字典添加元素的几种方法
Sep 30 Python
python3中apply函数和lambda函数的使用详解
Feb 28 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
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
给ListBox添加双击事件示例代码
2013/12/02 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
JS简单计算器实例
2015/01/20 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
three.js 入门案例详解
2018/01/23 Javascript
jquery实现两个div中的元素相互拖动的方法分析
2020/04/05 jQuery
jQuery实现简单评论功能
2020/08/19 jQuery
Python中用pycurl监控http响应时间脚本分享
2015/02/02 Python
python计算圆周率pi的方法
2015/07/11 Python
Python利用ElementTree模块处理XML的方法详解
2017/08/31 Python
python 判断网络连通的实现方法
2018/04/22 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
python实现五子棋小游戏
2020/03/25 Python
浅谈Python大神都是这样处理XML文件的
2019/05/31 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
如何在django中实现分页功能
2020/04/22 Python
python实现单机五子棋
2020/08/28 Python
实现Python3数组旋转的3种算法实例
2020/09/16 Python
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
五年后的职业生涯规划
2014/03/04 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
养牛场项目建议书
2014/05/13 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
未婚证明格式
2015/06/15 职场文书
转学证明范本
2015/06/19 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
奖学金发言稿(范文)
2019/08/21 职场文书
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server
Win11局域网共享权限在哪里设置? Win11高级共享的设置技巧
2022/04/05 数码科技
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers