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文件处理
Feb 29 Python
python 专题九 Mysql数据库编程基础知识
Mar 16 Python
Python正则抓取新闻标题和链接的方法示例
Apr 24 Python
python pycurl验证basic和digest认证的方法
May 02 Python
Python中py文件转换成exe可执行文件的方法
Jun 14 Python
python爬虫的一个常见简单js反爬详解
Jul 09 Python
Python3 使用pillow库生成随机验证码
Aug 26 Python
Python中的list与tuple集合区别解析
Oct 12 Python
Python序列对象与String类型内置方法详解
Oct 22 Python
对python中assert、isinstance的用法详解
Nov 27 Python
python orm 框架中sqlalchemy用法实例详解
Feb 02 Python
解决django FileFIELD的编码问题
Mar 30 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随机显示图片的简单示例
2014/02/15 PHP
浅析php中json_encode()和json_decode()
2014/05/25 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
详解PHP中的 input属性(隐藏 只读 限制)
2017/08/14 PHP
php源码的使用方法讲解
2019/09/26 PHP
php7 参数、整形及字符串处理机制修改实例分析
2020/05/25 PHP
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
js同源策略详解
2015/05/21 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
React学习之事件绑定的几种方法对比
2017/09/24 Javascript
JS实现小球的弹性碰撞效果
2017/11/11 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
React Form组件的实现封装杂谈
2018/05/07 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
layui动态绑定事件的方法
2019/09/20 Javascript
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
python 将html转换为pdf的几种方法
2020/12/29 Python
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
写演讲稿要注意的六件事
2014/01/14 职场文书
社区党员先进事迹
2014/01/22 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
计算机求职自荐信范文
2014/04/19 职场文书
校庆标语集锦
2014/06/25 职场文书
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书
如何用JS实现简单的数据监听
2021/05/06 Javascript
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle
Python实现批量自动整理文件
2022/03/16 Python