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+Django在windows下的开发环境配置图解
Nov 11 Python
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
python循环监控远程端口的方法
Mar 14 Python
Python中的单继承与多继承实例分析
May 10 Python
python版本五子棋的实现代码
Dec 11 Python
Python WEB应用部署的实现方法
Jan 02 Python
Django之PopUp的具体实现方法
Aug 31 Python
python科学计算之numpy——ufunc函数用法
Nov 25 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
python随机打印成绩排名表
Jun 23 Python
一文搞懂Python Sklearn库使用
Aug 23 Python
Python TypeError: ‘float‘ object is not subscriptable错误解决
Dec 24 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
239军机修复记
2021/03/02 无线电
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
php模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
php使用GD实现颜色渐变实例
2015/06/02 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
2006/06/26 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
node.js中的fs.fchownSync方法使用说明
2014/12/16 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
vue脚手架中配置Sass的方法
2018/01/04 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
python使用Flask框架获取用户IP地址的方法
2015/03/21 Python
Python Requests库基本用法示例
2018/08/20 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
对python3新增的byte类型详解
2018/12/04 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
在Python中获取操作系统的进程信息
2019/08/27 Python
浅谈django url请求与数据库连接池的共享问题
2019/08/29 Python
Python列表list常用内建函数实例小结
2019/10/22 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
python-地图可视化组件folium的操作
2020/12/14 Python
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
音乐教师个人总结
2015/02/06 职场文书
《水浒传》读后感3篇(范文)
2019/09/19 职场文书
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL