這篇文章運用簡單易懂的例子給大家介紹Django中怎么操作ORM連表,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
成都創(chuàng)新互聯(lián)擁有一支富有激情的企業(yè)網(wǎng)站制作團隊,在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕10余年,專業(yè)且經(jīng)驗豐富。10余年網(wǎng)站優(yōu)化營銷經(jīng)驗,我們已為上1000家中小企業(yè)提供了成都做網(wǎng)站、網(wǎng)站建設(shè)解決方案,定制設(shè)計,設(shè)計滿意,售后服務(wù)無憂。所有客戶皆提供一年免費網(wǎng)站維護!
ORM連表操作
我們在學(xué)習(xí)django中的orm的時候,我們可以把一對多,多對多,分為正向和反向查找兩種方式。
正向查找:ForeignKey在 UserInfo表中,如果從UserInfo表開始向其他的表進行查詢,這個就是正向操作,反之如果從UserType表去查詢其他的表這個就是反向操作。
(1)一對多:models.ForeignKey(其他表)
(2)多對多:models.ManyToManyField(其他表)
(3)一對一:models.OneToOneField(其他表)
正向連表操作總結(jié):
所謂正、反向連表操作的認定無非是Foreign_Key字段在哪張表決定的,
Foreign_Key字段在哪張表就可以哪張表使用Foreign_Key字段連表,反之沒有Foreign_Key字段就使用與其關(guān)聯(lián)的小寫表名;
1對多:對象.外鍵.關(guān)聯(lián)表字段,values(外鍵字段__關(guān)聯(lián)表字段)
多對多:外鍵字段.all()
反向連表操作總結(jié):
通過value、value_list、fifter 方式反向跨表:小寫表名__關(guān)聯(lián)表字段
通過對象的形式反向跨表:小寫表面_set().all()
前端ajax需要攜帶的參數(shù)
根據(jù)前端參數(shù),返回不同數(shù)據(jù)庫結(jié)果
應(yīng)用場景:
(1)一對多:當(dāng)一張表中創(chuàng)建一行數(shù)據(jù)時,有一個單選的下拉框(可以被重復(fù)選擇)
例如:創(chuàng)建用戶信息時候,需要選擇一個用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等。
(2)多對多:在某表中創(chuàng)建一行數(shù)據(jù)是,有一個可以多選的下拉框。
例如:創(chuàng)建用戶信息,需要為用戶指定多個愛好。
(3)一對一:在某表中創(chuàng)建一行數(shù)據(jù)時,有一個單選的下拉框(下拉框中的內(nèi)容被用過一次就消失了。
例如:原有含10列數(shù)據(jù)的一張表保存相關(guān)信息,經(jīng)過一段時間之后,10列無法滿足需求,需要為原來的表再添加5列數(shù)據(jù)。
1對多
如果A表的1條記錄對應(yīng)B表中N條記錄成立,兩表之間就是1對多關(guān)系;在1對多關(guān)系中 A表就是主表,B表為子表,F(xiàn)oreignKey字段就建在子表;
如果B表的1條記錄也對應(yīng)A表中N條記錄,兩表之間就是雙向1對多關(guān)系,也稱為多對多關(guān)系;
在orm中設(shè)置如果 A表設(shè)置了外鍵字段user=models.ForeignKey('UserType')到B表(注意外鍵表名加引號)
就意味著 寫在寫A表的B表主鍵, (一列),代表B表的多個(一行)稱為1對多,
查詢
總結(jié):利用orm獲取 數(shù)據(jù)庫表中多個數(shù)據(jù)
獲取到的數(shù)據(jù)類型本質(zhì)上都是 queryset類型,
類似于列表,
內(nèi)部有3種表現(xiàn)形式(對象,字典,列表)
modle.表名.objects.all()
modle.表名.objects.values()
modle.表名.objects.values()
跨表
正操作
所以表間只要有外鍵關(guān)系就可以一直點下去。
所以可以通過obj.外鍵.B表的列表跨表操作(注意?。rm連表操作必須選拿單個對象,不像SQL中直接表和表join就可以了)
print(obj.cls.title)
foreignkey字段在那個表里,那個表里一個"空格"代表那個表的多個(一行)
class UserGroup(models.Model): """ 部門 3 """ title = models.CharField(max_length=32) class UserInfo(models.Model): """ 員工4 """ nid = models.BigAutoField(primary_key=True) user = models.CharField(max_length=32) password = models.CharField(max_length=64) age = models.IntegerField(default=1) # ug_id 1 ug = models.ForeignKey("UserGroup",null=True)
1. 在取得時候跨表
q = UserInfo.objects.all().first()
q.ug.title
2. 在查的時候就跨表了
UserInfo.objects.values('nid','ug_id')
UserInfo.objects.values('nid','ug_id','ug__title') #注意正向連表是 外鍵__外鍵列 反向是小寫的表名
3. UserInfo.objects.values_list('nid','ug_id','ug__title')
反向連表:
反向操作無非2種方式:
(1)通過對象的形式反向跨表:小寫表面_set().all()
(2)通過value和value_list方式反向跨表:小寫表名__字段
1. 小寫的表名_set 得到有外鍵關(guān)系的對象
obj = UserGroup.objects.all().first()
result = obj.userinfo_set.all() [userinfo對象,userinfo對象,]
2. 小寫的表名 得到有外鍵關(guān)系的列 #因為使用values取值取得是字典的不是對象,所以需要 小寫表名(外鍵表)__
v = UserGroup.objects.values('id','title')
v = UserGroup.objects.values('id','title','小寫的表名稱')
v = UserGroup.objects.values('id','title','小寫的表名稱__age')
3. 小寫的表名 得到有外鍵關(guān)系的列
v = UserGroup.objects.values_list('id','title')
v = UserGroup.objects.values_list('id','title','小寫的表名稱')
v = UserGroup.objects.values_list('id','title','小寫的表名稱__age')
1對多自關(guān)聯(lián)( 由原來的2張表,變成一張表! )
想象有第二張表,關(guān)聯(lián)自己表中的行
代碼
class Comment(models.Model): """ 評論表 """ news_id = models.IntegerField() # 新聞ID content = models.CharField(max_length=32) # 評論內(nèi)容 user = models.CharField(max_length=32) # 評論者 reply = models.ForeignKey('Comment',null=True,blank=True,related_name='xxxx') #回復(fù)ID
多對多:
1、自己寫第3張關(guān)系表
ORM多對多查詢:
女士表:
男生表:
男女關(guān)系表
多對跨表操作
#獲取方少偉有染的女孩 obj=models.Boy.objects.filter(name='方少偉').first() obj_list=obj.love_set.all() for row in obj_list: print(row.g.nike) # 獲取和蒼井空有染的男孩 obj=models.Girl.objects.filter(nike='蒼井空').first() user_list=obj.love_set.all() for row in user_list: print(row.b.name)
多對多關(guān)系表 數(shù)據(jù)查找思路
(1)找到該對象
(2)通過該對象 反向操作 找到第三張關(guān)系表
(3)通過第三張關(guān)系表 正向操作 找到 和該對象有關(guān)系對象
總結(jié)
只要對象1和對象2 中間有關(guān)系表建立了關(guān)系; 對象1反向操作 到關(guān)系表 ,關(guān)系表正向操作到對象2,反之亦然。
2、第3張關(guān)系表不用寫(m=models.ManyToManyField(' 要關(guān)聯(lián)的表') 自動生成)
由于 DjangoORM中一個類名對應(yīng)一張表,要想操作表就modles.類直接操作那張表,但使用ManyToManyField字段生成 “第三張”關(guān)系表怎么操作它呢?
答案:通過單個objd對象 間接操作
class Boy(models.Model): name = models.CharField(max_length=32) m = models.ManyToManyField('Girl',through="Love",through_fields=('b','g',)) class Girl(models.Model): nick = models.CharField(max_length=32) m = models.ManyToManyField('Boy')
正向操作: obj.m.all()
obj = models.Boy.objects.filter(name='方少偉').first() print(obj.id,obj.name) obj.m.add(2) obj.m.add(2,4) obj.m.add(*[1,]) obj.m.remove(1) obj.m.remove(2,3) obj.m.remove(*[4,]) obj.m.set([1,]) q = obj.m.all() # [Girl對象] print(q) obj = models.Boy.objects.filter(name='方少偉').first() girl_list = obj.m.all() obj = models.Boy.objects.filter(name='方少偉').first() girl_list = obj.m.all() girl_list = obj.m.filter(nick='小魚') print(girl_list) obj = models.Boy.objects.filter(name='方少偉').first() obj.m.clear()
反向操作 :obj.小寫的表名_set
多對多和外鍵跨表一樣都是 小寫的表名_set
3、既自定義第三張關(guān)系表 也使用ManyToManyField('Boy')字段(雜交類型)
ManyToManyField()字段創(chuàng)建第3張關(guān)系表,可以使用字段跨表查詢,但無法直接操作第3張表,
自建第3表關(guān)系表可以直接操作,但無法通過字段 查詢,我們可以把他們結(jié)合起來使用;
作用:
(1)既可以使用字段跨表查詢,也可以直接操作第3張關(guān)系表
(2)obj.m.all() 只有查詢和清空方法
外鍵反向查找別名(方便反向查找)
在寫ForeignKey字段的時候,如果想要在反向查找時不使用默認的 小寫的表名_set,就在定義這個字段的時間加related參數(shù)!
related_name、related_query_name 字段=什么別名 反向查找時就使用什么別名!
反向查找:
設(shè)置了related_query_name 反向查找時就是obj.別名_set.all()保留了_set
related_query_name
related_name
反向查找:
設(shè)置了relatedname就是 反向查找時就說 obj.別名.all()
多對多自關(guān)聯(lián)(由原來的3張表,變成只有2張表)
把兩張表通過 choices字段合并為一張表
‘第三張關(guān)系表’ 使用models.ManyToManyField('Userinfo')生成
特性:
obj = models.UserInfo.objects.filter(id=1).first() 獲取對象
(1)查詢第三張關(guān)系表前面那一列:obj.m
select xx from xx where from_userinfo_id = 1
(2)查詢第三張關(guān)系表后面那一列:obj.userinfo_set
select xx from xx where to_userinfo_id = 1
多對多自關(guān)聯(lián)特性:
ManyToManyField生成的第三張表
關(guān)于Django中怎么操作ORM連表就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。