一、A表男生,B表女生,C表關(guān)系
![](/d/20211017/a168035d4a25aa9e388fd3a708944c16.gif)
![](/d/20211017/b5784ac4cedb1b96828694a7f81297b7.gif)
![](/d/20211017/16e3cee073cb26d7df024012e090bfde.gif)
![](/d/20211017/5ce22730d987e2f9805a182518e47c56.gif)
1通過A表查與某個(gè)男生有關(guān)系的所有女生
思想1:在A表中確認(rèn)男生后,通過反查到C表,獲取相關(guān)內(nèi)容(QuerySet),然后再跨到B表獲取所有女生信息。
obj=models.Boy.objects.filter(name='陳亮').first()
love_list=obj.love_set.all() #love_set.all()反查相關(guān)所有(跨表)
for i in love_list: #每個(gè)i是一個(gè)Love的對(duì)象,里面有一個(gè)id有一個(gè)nick
print(i.g.nick) #g是models里面class里面的屬性
思想2:通過C表跨到A表找到對(duì)應(yīng)男生,然后再跨到B表找到女生
love_list=models.Love.objects.filter(b__name='陳亮') #這個(gè)是b__跨表查詢
for i in love_list:
print(i.g.nick, love_list) #這個(gè)是按照.類里面的名字查詢
二、A表男生,B表女生,自動(dòng)創(chuàng)建C表ManyToManyField
![](/d/20211017/a168035d4a25aa9e388fd3a708944c16.gif)
![](/d/20211017/b5784ac4cedb1b96828694a7f81297b7.gif)
![](/d/20211017/43dddb75058a719d1bf480b06e874c8e.gif)
![](/d/20211017/f797d4cbcb40db36b4a167580fa1bcf4.gif)
class Boy(models.Model):
name = models.CharField(max_length=32)
m=models.ManyToManyField('Girl') # 讓其自動(dòng)創(chuàng)建一個(gè)表
通過boy表查對(duì)應(yīng)的girl
obj=models.Boy.objects.filter(name='陳亮').first()
# obj.m.add(2,3) #添加新關(guān)系
# obj.m.clear() #把跟name='陳亮‘有關(guān)的全部刪除
girl_list=obj.m.all() #直接通過.m就查到女孩相關(guān)所有
#girl_list = obj.m.filter(二次篩選)
for i in girl_list:
print(i.id,i.nick)
通過girl反查對(duì)應(yīng)的男孩
oss = models.Girl.objects.filter(nick='小貓').first()
a=oss.boy_set.all() #跨表查詢
for i in a:
print(i.name)
三、A表男女混合表,B表關(guān)系表
![](/d/20211017/461f9dfc8478333e55669c5654774acb.gif)
![](/d/20211017/06c5280c8c4b8d6f350a1c14428a0080.gif)
![](/d/20211017/c2a3316488b98ae66b53314fbc5617a4.gif)
![](/d/20211017/6a01b727ee18349ae4e9b7c667d61506.gif)
思路:男女信息(名字,性別等)都放在一個(gè)表,另外一個(gè)表(兩個(gè)屬性)放一個(gè)男生的外鍵(記錄男生id)放一個(gè)女生的外鍵(記錄女生的id)
問題:反查的時(shí)候需要兩個(gè)外鍵不知所措(之前的都是一個(gè)外鍵)
解決方法:related_query_name或者related_name(更簡(jiǎn)單)
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 關(guān)聯(lián)的是哪個(gè)ForeignKey
#obj對(duì)象男.girl_set.all() 把這個(gè)名字換成related_query_name的名字
#obj對(duì)象女.boy_set.all() #默認(rèn)表明+_set
#related_name 更簡(jiǎn)單
#obj對(duì)象男.girl.all() 這種方法改名可以直接寫b.all()獲取有關(guān)聯(lián)的所有女性表
#obj對(duì)象女.boy.all()
從男女混合表中查到具體人對(duì)應(yīng)所有的有關(guān)系的異性
obj=models.Boy_and_girl.objects.filter(id=3).first() #對(duì)象
if obj.gender==1:
bb=obj.girls.all() #根據(jù)對(duì)象反向查找到跟對(duì)象有關(guān)的所有信息(在另外一張表上)
for i in bb:
print(i.g.nickname) #再帶著相關(guān)信息(女孩)回到原來的表再查詢
else:
bb = obj.boys.all()
for i in bb:
print(i.b.nickname)
四、A表男女混合表(從一張表開始)FK自關(guān)聯(lián)
![](/d/20211017/24cd7acf4b10378cc56084c817708c53.gif)
![](/d/20211017/37cebdeec8a6b8672ffe537b4a8f7d7a.gif)
思路:男女混合表,在同一張表自動(dòng)生成另外一張自己與自己相關(guān)聯(lián)的表(類似于二)
class Boy_and_girl (models.Model):
name = models.CharField(max_length=32)
m=models.ManyToManyField(' Boy_and_girl ',related_name='boy')
obj=models.Boy. Boy_and_girl.filter(id=1).first() #找的id=1是男生
girl_list=obj.m.all() #以左邊為條件去查,(一共有左(男生)右(女生)兩個(gè)選項(xiàng),從左查為正查,從右查為反查)
for i in girl_list:
print(i.nickname)
#若是這個(gè)obj是屬于右邊選項(xiàng)的,想要反查左邊的,得用小寫表名_set來進(jìn)行反查比如:
obj. boy_and_girl_set.all() 或者obj.boy.all()
ps:
Django model中的class Meta詳解
以上就是Django-ORM-連表正反操作的詳細(xì)內(nèi)容,更多關(guān)于Django-ORM-連表正反操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- 一篇文章帶你自學(xué)python Django
- python之django路由和視圖案例教程
- python Django框架快速入門教程(后臺(tái)管理)
- Python django中如何使用restful框架
- 利用Python Django實(shí)現(xiàn)簡(jiǎn)單博客系統(tǒng)
- Python Django 后臺(tái)管理之后臺(tái)模型屬性詳解
- python之Django自動(dòng)化資產(chǎn)掃描的實(shí)現(xiàn)
- python Django的顯示個(gè)人信息詳解