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 22 Python
浅析Python四种数据类型
Sep 26 Python
python使用requests模块实现爬取电影天堂最新电影信息
Apr 03 Python
使用Python实现企业微信的自动打卡功能
Apr 30 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
Jul 05 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
Python文件操作方法详解
Feb 09 Python
通过python 执行 nohup 不生效的解决
Apr 16 Python
jupyter修改文件名方式(TensorFlow)
Apr 21 Python
Python基于httpx模块实现发送请求
Jul 07 Python
Python爬虫入门教程01之爬取豆瓣Top电影
Jan 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
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
2013/04/08 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
php判断数组元素中是否存在某个字符串的方法
2014/06/14 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
python 获取本机ip地址的两个方法
2013/02/25 Python
python生成随机验证码(中文验证码)示例
2014/04/03 Python
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
python实现堆和索引堆的代码示例
2018/03/19 Python
python迭代dict的key和value的方法
2018/07/06 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
Python生成个性签名图片获取GUI过程解析
2019/12/16 Python
Python预测2020高考分数和录取情况
2020/07/08 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
公共汽车、火车和飞机票的通用在线预订和销售平台:INFOBUS
2019/11/30 全球购物
分公司经理岗位职责
2013/11/11 职场文书
员工工作表扬信范文
2014/01/13 职场文书
三八节标语
2014/06/27 职场文书
民事授权委托书范文
2014/08/02 职场文书
代收款委托书范本
2014/10/01 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
Python合并多张图片成PDF
2021/06/09 Python
Python开发五子棋小游戏
2022/04/28 Python