Python Django ORM连表正反操作技巧


Posted in Python onJune 13, 2021

一、A表男生,B表女生,C表关系

Python Django ORM连表正反操作技巧Python Django ORM连表正反操作技巧Python Django ORM连表正反操作技巧Python Django ORM连表正反操作技巧

1通过A表查与某个男生有关系的所有女生

思想1:在A表中确认男生后,通过反查到C表,获取相关内容(QuerySet),然后再跨到B表获取所有女生信息。

obj=models.Boy.objects.filter(name='陈亮').first()
love_list=obj.love_set.all()  #love_set.all()反查相关所有(跨表)
for i in love_list:  #每个i是一个Love的对象,里面有一个id有一个nick
    print(i.g.nick)      #g是models里面class里面的属性

思想2:通过C表跨到A表找到对应男生,然后再跨到B表找到女生

love_list=models.Love.objects.filter(b__name='陈亮')  #这个是b__跨表查询
 for i in love_list:
     print(i.g.nick, love_list)    #这个是按照.类里面的名字查询

二、A表男生,B表女生,自动创建C表ManyToManyField

Python Django ORM连表正反操作技巧Python Django ORM连表正反操作技巧Python Django ORM连表正反操作技巧Python Django ORM连表正反操作技巧

class Boy(models.Model):
    name = models.CharField(max_length=32)
    m=models.ManyToManyField('Girl')  # 让其自动创建一个表

通过boy表查对应的girl

obj=models.Boy.objects.filter(name='陈亮').first()
# obj.m.add(2,3)  #添加新关系
# obj.m.clear()   #把跟name='陈亮‘有关的全部删除
   girl_list=obj.m.all()   #直接通过.m就查到女孩相关所有
#girl_list = obj.m.filter(二次筛选)
   for i in girl_list:
       print(i.id,i.nick)

通过girl反查对应的男孩

oss = models.Girl.objects.filter(nick='小猫').first()
a=oss.boy_set.all()  #跨表查询
for i in a:
     print(i.name)

三、A表男女混合表,B表关系表

Python Django ORM连表正反操作技巧&&&Python Django ORM连表正反操作技巧

Python Django ORM连表正反操作技巧Python Django ORM连表正反操作技巧

思路:男女信息(名字,性别等)都放在一个表,另外一个表(两个属性)放一个男生的外键(记录男生id)放一个女生的外键(记录女生的id)

问题:反查的时候需要两个外键不知所措(之前的都是一个外键)

解决方法:related_query_name或者related_name(更简单)

g=models.ForeignKey('Boy_and_girl',related_name='boys',on_delete=models.CASCADE,null=True)

#以前跨表需要写上obj.小写的表名_set.all 比如obj.boy_set.all(),用了**后就不用写小写的表名_set了

#related_query_name 关联的是哪个ForeignKey
#obj对象男.girl_set.all() 把这个名字换成related_query_name的名字
#obj对象女.boy_set.all() #默认表明+_set

#related_name 更简单
#obj对象男.girl.all() 这种方法改名可以直接写b.all()获取有关联的所有女性表
#obj对象女.boy.all()

从男女混合表中查到具体人对应所有的有关系的异性

obj=models.Boy_and_girl.objects.filter(id=3).first() #对象
if obj.gender==1:
    bb=obj.girls.all()      #根据对象反向查找到跟对象有关的所有信息(在另外一张表上)
    for i in bb:
        print(i.g.nickname)  #再带着相关信息(女孩)回到原来的表再查询
else:
    bb = obj.boys.all()
    for i in bb:
        print(i.b.nickname)

四、A表男女混合表(从一张表开始)FK自关联

Python Django ORM连表正反操作技巧&&&Python Django ORM连表正反操作技巧

思路:男女混合表,在同一张表自动生成另外一张自己与自己相关联的表(类似于Django model中的class Meta详解

以上就是Django-ORM-连表正反操作的详细内容,更多关于Django-ORM-连表正反操作的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python 获取本机ip地址的两个方法
Feb 25 Python
python将xml xsl文件生成html文件存储示例讲解
Dec 03 Python
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
详解Python中的type和object
Aug 15 Python
详解分布式任务队列Celery使用说明
Nov 29 Python
selenium获取当前页面的url、源码、title的方法
Jun 12 Python
django 消息框架 message使用详解
Jul 22 Python
django 框架实现的用户注册、登录、退出功能示例
Nov 28 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
什么是python类属性
Jun 10 Python
Django-silk性能测试工具安装及使用解析
Nov 28 Python
python图片灰度化处理的几种方法
Jun 23 Python
Python scrapy爬取起点中文网小说榜单
教你用Python爬取英雄联盟皮肤原画
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
python基础入门之普通操作与函数(三)
python基础入门之字典和集合
Python OpenCV实现传统图片格式与base64转换
Jun 13 #Python
python实现A*寻路算法
You might like
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
php array_chunk()函数用法与注意事项
2019/07/12 PHP
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
js读写json文件实例代码
2014/10/21 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
Google Maps基础及实例解析
2016/08/06 Javascript
WEB前端实现裁剪上传图片功能
2016/10/17 Javascript
JavaScript对象引用与赋值实例详解
2017/03/15 Javascript
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
jQuery基于Ajax实现读取XML数据功能示例
2018/05/31 jQuery
layui的table中显示图片方法
2018/08/17 Javascript
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
学习python的几条建议分享
2013/02/10 Python
python多线程编程方式分析示例详解
2013/12/06 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
用Python进行TCP网络编程的教程
2015/04/29 Python
在Django的模板中使用认证数据的方法
2015/07/23 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
对Python random模块打乱数组顺序的实例讲解
2018/11/08 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
python中的print()输出
2019/04/12 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
美国健康和保健平台:healtop
2020/07/02 全球购物
医学生实习自荐信
2013/10/01 职场文书
《春晓》教学反思
2014/04/20 职场文书
服务口号大全
2014/06/11 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
考研导师推荐信范文
2015/03/27 职场文书
新入职员工工作总结
2015/10/15 职场文书
《所见》教学反思
2016/02/23 职场文书
Java 在线考试云平台的实现
2021/11/23 Java/Android