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实现的二叉树算法和kmp算法实例
Apr 25 Python
Python使用minidom读写xml的方法
Jun 03 Python
Python Requests安装与简单运用
Apr 07 Python
Python正则替换字符串函数re.sub用法示例
Jan 19 Python
Python文本特征抽取与向量化算法学习
Dec 22 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
Jan 22 Python
安装python3的时候就是输入python3死活没有反应的解决方法
Jan 24 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
浅谈Pytorch torch.optim优化器个性化的使用
Feb 20 Python
Python3 用matplotlib绘制sigmoid函数的案例
Dec 11 Python
Django集成富文本编辑器summernote的实现步骤
May 31 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
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
IE6图片加载的一个BUG解决方法
2010/07/13 Javascript
eclipse如何忽略js文件报错(附图)
2013/10/30 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
浅析Node.js中的内存泄漏问题
2015/06/23 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
纯前端JavaScript实现Excel IO案例分享
2016/08/26 Javascript
AngularJS全局scope与Isolate scope通信用法示例
2016/11/22 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
关于JavaScript的单双引号嵌套问题
2017/08/20 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
JS中call和apply函数用法实例分析
2018/06/20 Javascript
使用vue的transition完成滑动过渡的示例代码
2018/06/25 Javascript
微信小程序仿朋友圈发布动态功能
2018/07/15 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
如何利用Pyecharts可视化微信好友
2019/07/04 Python
银行财务部实习生的自我鉴定
2013/11/27 职场文书
安全生产实施方案
2014/02/23 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
诚信考试标语
2014/06/24 职场文书
应用外语系自荐信
2014/06/26 职场文书
社团活动总结格式
2014/08/29 职场文书
水电工程师岗位职责
2015/02/13 职场文书
党员承诺书格式范文
2015/04/28 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
Python爬虫基础初探selenium
2021/05/31 Python
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers
Redis唯一ID生成器的实现
2022/07/07 Redis