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 文件与目录操作
Dec 24 Python
Python 元组(Tuple)操作详解
Mar 11 Python
Python BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
Python中的getopt函数使用详解
Jul 28 Python
Python统计文件中去重后uuid个数的方法
Jul 30 Python
在Python中通过threading模块定义和调用线程的方法
Jul 12 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
May 24 Python
django自带调试服务器的使用详解
Aug 29 Python
python数据持久存储 pickle模块的基本使用方法解析
Aug 30 Python
Python super()方法原理详解
Mar 31 Python
python爬取代理ip的示例
Dec 18 Python
Python数据分析之pandas函数详解
Apr 21 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的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
2016/12/05 PHP
php 中的closure用法详解
2017/06/12 PHP
php新建文件的方法实例
2019/09/26 PHP
用cssText批量修改样式
2009/08/29 Javascript
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
IE6不能修改NAME问题的解决方法
2010/09/03 Javascript
jQuery动态地获取系统时间实现代码
2013/05/24 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
简述Angular 5 快速入门
2017/11/04 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
Vue 组件封装 并使用 NPM 发布的教程
2018/09/30 Javascript
JS执行控制之节流模式实例分析
2018/12/21 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
JavaScript代码模拟鼠标自动点击事件示例
2020/08/07 Javascript
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
Python中类的继承代码实例
2014/10/28 Python
python查看FTP是否能连接成功的方法
2015/07/30 Python
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
CSS3实现swap交换动画
2016/01/19 HTML / CSS
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
HTML5 拖放功能实现代码
2016/07/14 HTML / CSS
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
个人生活学习自我评价范文
2013/11/26 职场文书
幼儿园中秋节活动方案2013
2014/01/29 职场文书
横幅标语大全
2014/06/17 职场文书
具结保证书范本
2015/05/11 职场文书
行为规范主题班会
2015/08/13 职场文书
聊聊CSS粘性定位sticky案例解析
2022/06/01 HTML / CSS