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类定义和类继承详解
May 08 Python
使用python在本地电脑上快速处理数据
Jun 22 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
Dec 12 Python
1 行 Python 代码快速实现 FTP 服务器
Jan 25 Python
python中正则表达式与模式匹配
May 07 Python
Pyqt5 基本界面组件之inputDialog的使用
Jun 25 Python
Python socket实现的文件下载器功能示例
Nov 15 Python
Python异常继承关系和自定义异常实现代码实例
Feb 20 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
Mar 10 Python
Django models filter筛选条件详解
Mar 16 Python
Python字典的基础操作
Nov 01 Python
pandas中关于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
调整PHP的性能
2013/10/30 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
php如何获取文件的扩展名
2015/10/28 PHP
利用PHP如何写APP接口详解
2016/08/23 PHP
理解Javascript_13_执行模型详解
2010/10/20 Javascript
基于jQuery的遍历同id元素 并响应事件的代码
2012/06/14 Javascript
Jquery中ajax方法data参数的用法小结
2014/02/12 Javascript
用js设置下拉框为只读的小技巧
2014/04/10 Javascript
jquery统计用户选中的复选框的个数
2014/06/06 Javascript
jquery单行文字向上滚动效果的实现代码
2014/09/05 Javascript
js实现仿百度风云榜可重复多次调用的TAB切换选项卡效果
2015/08/31 Javascript
AngularJs解决跨域问题案例详解(简单方法)
2016/05/19 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
JavaScript在web自动化测试中的作用示例详解
2019/08/25 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
webpack4从0搭建组件库的实现
2020/11/29 Javascript
用vue设计一个日历表
2020/12/03 Vue.js
wxPython窗口的继承机制实例分析
2014/09/28 Python
python内存管理分析
2015/04/08 Python
不要用强制方法杀掉python线程
2017/02/26 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
英国体育器材进口商店:UK Sport Imports
2017/03/14 全球购物
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
计算机网络专业推荐信
2013/11/24 职场文书
益达广告词
2014/03/14 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
2014年幼儿园工作总结
2014/11/10 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
写给媳妇的检讨书
2015/05/06 职场文书