Django中怎么操作ORM連表

這篇文章運用簡單易懂的例子給大家介紹Django中怎么操作ORM連表,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

成都創(chuàng)新互聯(lián)擁有一支富有激情的企業(yè)網(wǎng)站制作團隊,在互聯(lián)網(wǎng)網(wǎng)站建設行業(yè)深耕10余年,專業(yè)且經驗豐富。10余年網(wǎng)站優(yōu)化營銷經驗,我們已為上1000家中小企業(yè)提供了成都做網(wǎng)站、網(wǎng)站建設解決方案,定制設計,設計滿意,售后服務無憂。所有客戶皆提供一年免費網(wǎng)站維護!

ORM連表操作

我們在學習django中的orm的時候,我們可以把一對多,多對多,分為正向和反向查找兩種方式。

正向查找:ForeignKey在 UserInfo表中,如果從UserInfo表開始向其他的表進行查詢,這個就是正向操作,反之如果從UserType表去查詢其他的表這個就是反向操作。

(1)一對多:models.ForeignKey(其他表)

(2)多對多:models.ManyToManyField(其他表)

(3)一對一:models.OneToOneField(其他表)

正向連表操作總結:

所謂正、反向連表操作的認定無非是Foreign_Key字段在哪張表決定的,

Foreign_Key字段在哪張表就可以哪張表使用Foreign_Key字段連表,反之沒有Foreign_Key字段就使用與其關聯(lián)的小寫表名;

1對多:對象.外鍵.關聯(lián)表字段,values(外鍵字段__關聯(lián)表字段)

多對多:外鍵字段.all()

反向連表操作總結:

通過value、value_list、fifter 方式反向跨表:小寫表名__關聯(lián)表字段

通過對象的形式反向跨表:小寫表面_set().all()

前端ajax需要攜帶的參數(shù) 

根據(jù)前端參數(shù),返回不同數(shù)據(jù)庫結果

應用場景:

(1)一對多:當一張表中創(chuàng)建一行數(shù)據(jù)時,有一個單選的下拉框(可以被重復選擇)

例如:創(chuàng)建用戶信息時候,需要選擇一個用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等。

(2)多對多:在某表中創(chuàng)建一行數(shù)據(jù)是,有一個可以多選的下拉框。

例如:創(chuàng)建用戶信息,需要為用戶指定多個愛好。

Django中怎么操作ORM連表

(3)一對一:在某表中創(chuàng)建一行數(shù)據(jù)時,有一個單選的下拉框(下拉框中的內容被用過一次就消失了。

例如:原有含10列數(shù)據(jù)的一張表保存相關信息,經過一段時間之后,10列無法滿足需求,需要為原來的表再添加5列數(shù)據(jù)。

1對多

如果A表的1條記錄對應B表中N條記錄成立,兩表之間就是1對多關系;在1對多關系中 A表就是主表,B表為子表,F(xiàn)oreignKey字段就建在子表;

如果B表的1條記錄也對應A表中N條記錄,兩表之間就是雙向1對多關系,也稱為多對多關系;

在orm中設置如果 A表設置了外鍵字段user=models.ForeignKey('UserType')到B表(注意外鍵表名加引號)

就意味著 寫在寫A表的B表主鍵, (一列),代表B表的多個(一行)稱為1對多,

查詢

總結:利用orm獲取 數(shù)據(jù)庫表中多個數(shù)據(jù)

獲取到的數(shù)據(jù)類型本質上都是 queryset類型,

類似于列表,

內部有3種表現(xiàn)形式(對象,字典,列表)

modle.表名.objects.all()

modle.表名.objects.values()

modle.表名.objects.values()

跨表

正操作

所以表間只要有外鍵關系就可以一直點下去。

所以可以通過obj.外鍵.B表的列表跨表操作(注意!!orm連表操作必須選拿單個對象,不像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 得到有外鍵關系的對象

obj = UserGroup.objects.all().first()

result = obj.userinfo_set.all() [userinfo對象,userinfo對象,]

2. 小寫的表名 得到有外鍵關系的列 #因為使用values取值取得是字典的不是對象,所以需要 小寫表名(外鍵表)__

v = UserGroup.objects.values('id','title') 

v = UserGroup.objects.values('id','title','小寫的表名稱') 

v = UserGroup.objects.values('id','title','小寫的表名稱__age') 

3. 小寫的表名 得到有外鍵關系的列

v = UserGroup.objects.values_list('id','title') 

v = UserGroup.objects.values_list('id','title','小寫的表名稱') 

v = UserGroup.objects.values_list('id','title','小寫的表名稱__age')

1對多自關聯(lián)( 由原來的2張表,變成一張表! )

想象有第二張表,關聯(lián)自己表中的行

Django中怎么操作ORM連表

Django中怎么操作ORM連表

代碼

    class Comment(models.Model):
                """
                評論表
                """
                news_id = models.IntegerField()            # 新聞ID
                content = models.CharField(max_length=32)  # 評論內容
                user = models.CharField(max_length=32)     # 評論者
                reply = models.ForeignKey('Comment',null=True,blank=True,related_name='xxxx') #回復ID

多對多:

1、自己寫第3張關系表

ORM多對多查詢:

女士表:

Django中怎么操作ORM連表

男生表:

Django中怎么操作ORM連表

男女關系表

Django中怎么操作ORM連表

多對跨表操作

#獲取方少偉有染的女孩
    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)

多對多關系表   數(shù)據(jù)查找思路

(1)找到該對象

(2)通過該對象 反向操作 找到第三張關系表

(3)通過第三張關系表 正向操作 找到 和該對象有關系對象

總結

只要對象1和對象2 中間有關系表建立了關系; 對象1反向操作 到關系表 ,關系表正向操作到對象2,反之亦然。

2、第3張關系表不用寫(m=models.ManyToManyField(' 要關聯(lián)的表') 自動生成)

Django中怎么操作ORM連表

由于 DjangoORM中一個類名對應一張表,要想操作表就modles.類直接操作那張表,但使用ManyToManyField字段生成 “第三張”關系表怎么操作它呢?

答案:通過單個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、既自定義第三張關系表 也使用ManyToManyField('Boy')字段(雜交類型)

ManyToManyField()字段創(chuàng)建第3張關系表,可以使用字段跨表查詢,但無法直接操作第3張表,

自建第3表關系表可以直接操作,但無法通過字段 查詢,我們可以把他們結合起來使用;

作用:

(1)既可以使用字段跨表查詢,也可以直接操作第3張關系表

(2)obj.m.all() 只有查詢和清空方法

外鍵反向查找別名(方便反向查找)

在寫ForeignKey字段的時候,如果想要在反向查找時不使用默認的 小寫的表名_set,就在定義這個字段的時間加related參數(shù)!

related_name、related_query_name 字段=什么別名 反向查找時就使用什么別名!

反向查找:

設置了related_query_name 反向查找時就是obj.別名_set.all()保留了_set

related_query_name

related_name

反向查找:

設置了relatedname就是 反向查找時就說 obj.別名.all()  

多對多自關聯(lián)(由原來的3張表,變成只有2張表)

把兩張表通過 choices字段合并為一張表

‘第三張關系表’ 使用models.ManyToManyField('Userinfo')生成

特性:

obj = models.UserInfo.objects.filter(id=1).first()  獲取對象

(1)查詢第三張關系表前面那一列:obj.m

select xx from xx where from_userinfo_id = 1

(2)查詢第三張關系表后面那一列:obj.userinfo_set

select xx from xx where to_userinfo_id = 1

多對多自關聯(lián)特性:

Django中怎么操作ORM連表

ManyToManyField生成的第三張表

Django中怎么操作ORM連表

關于Django中怎么操作ORM連表就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

當前文章:Django中怎么操作ORM連表
分享路徑:http://muchs.cn/article34/jcpsse.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、外貿建站、網(wǎng)站維護、云服務器、響應式網(wǎng)站、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化