溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何了解Django ORM操作

發(fā)布時(shí)間:2021-10-20 17:06:32 來(lái)源:億速云 閱讀:122 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“如何了解Django ORM操作”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何了解Django ORM操作”吧!

查詢操作

對(duì)象.外鍵字段

比如,我們拿到了一個(gè)書(shū)的信息,我們可以這樣打印他的信息。

代碼

book = models.Book.objects.filter(title="<<大明帝國(guó)>>").first() print(f"book類型:{type(book)}") print(f"id:{book.id}") print(f"書(shū)名:{book.title}") print(f"價(jià)格:{book.price}") print(f"書(shū)名:{book.PublishDate}") print(f"出版社:{book.publish}") # 外鍵字段

執(zhí)行結(jié)果

如何了解Django ORM操作

注:藍(lán)色為外鍵字段

不知道你有沒(méi)有疑問(wèn),為什么book.publish會(huì)把郵電出版社打印出來(lái)。

這個(gè)原因主要在于外鍵對(duì)象的__str__方法。

如何了解Django ORM操作

就是因?yàn)槲襊ublish返回的是self.title,所以才能打印出來(lái)郵電出版社,如果我想打印出版社聯(lián)系方式咋辦?

代碼

print(f"出版社類型:{type(book.publish)}")  # <class 'web.models.Publish'> # book.publish已經(jīng)是models.Publish對(duì)象,所以可以自由調(diào)里面的屬性 print(f"出版社電話:{book.publish.phone},")

執(zhí)行結(jié)果

如何了解Django ORM操作

總結(jié)

對(duì)象.外鍵字段拿到的就是外鍵字段對(duì)象,直接就可以通過(guò)對(duì)象.外鍵字段.外鍵屬性獲取具體值。

反向查詢(表名__set.all())

上述我們是通過(guò)正向查詢的方式查詢到了書(shū)對(duì)應(yīng)的出版社具體信息。

但是如果說(shuō),我們拿到的就是一個(gè)出版社名呢?

通常情況下,你可能會(huì)這樣!

代碼

# 查詢郵電出版社 publish_obj = models.Publish.objects.filter(title="郵電出版社").first() # 獲取出版社id publish_id = publish_obj.id # 查詢publish_id為出版社id的 book_list = models.Book.objects.filter(publish_id=publish_id) print(book_list)

執(zhí)行結(jié)果

如何了解Django ORM操作

其實(shí),還有一種方法:通過(guò)一個(gè)對(duì)象,反向查多個(gè)對(duì)象。

代碼

publish_obj = models.Publish.objects.filter(title="郵電出版社").first() book_list = publish_obj.book_set.all() print(book_list)

執(zhí)行結(jié)果

如何了解Django ORM操作

雙下劃線跨表查詢

還是上述這個(gè)問(wèn)題,通過(guò)一個(gè)出版社名,查找屬于這個(gè)出版社的圖書(shū)。

基于雙下劃線的跨表查詢,理論是更簡(jiǎn)單的!

如何了解Django ORM操作

注:可以看到還有__contains等其他filter條件查詢,通過(guò)__跨表依然是可以通用的。

代碼

book_list = models.Book.objects.filter(publish__title="郵電出版社") print(book_list)

執(zhí)行結(jié)果

如何了解Django ORM操作

連續(xù)跨表

__不僅可以進(jìn)行跨一張表,還能跨多張表。

以圖書(shū)Many作者表為例,根據(jù)出版社查詢圖書(shū)和作者多對(duì)多的信息。

代碼

ret = models.BookManyAuthor.objects.filter(book__publish__title="郵電出版社") print(ret)

跨了book表又跨了publish表

如何了解Django ORM操作

執(zhí)行結(jié)果

如何了解Django ORM操作

values

有時(shí)候,我們可能只需要一些特定的列,這時(shí)候使用values即可。

代碼

# 語(yǔ)法 book_list = models.Book.objects.all().values("列1","列2",...) # 示例 book_list = models.Book.objects.all().values("title","price") print(book_list)

代碼

如何了解Django ORM操作

values返回的值有點(diǎn)像列表套字典,但是其實(shí)本質(zhì)還是QuerySet類型。

values_list

values_list和values功能一樣,都是取相關(guān)的列,但是返回的類型格式不一樣。

代碼

book_list = models.Book.objects.all().values_list("title","price") print(book_list)

執(zhí)行結(jié)果

如何了解Django ORM操作

這個(gè)有點(diǎn)像列表套元組,但是其實(shí)本質(zhì)還是QuerySet。

related_name

related_name通常用于反向查詢時(shí),替換<表名>_set。

原方式

models.py

如何了解Django ORM操作

代碼

# 查詢郵電出版社 publish = models.Publish.objects.filter(title="郵電出版社").first() print(publish) # 反向一對(duì)多 book_list = publish.book_set.all() print(book_list)

執(zhí)行結(jié)果

如何了解Django ORM操作

別名方式

models.py

如何了解Django ORM操作

代碼

# 查詢郵電出版社 publish = models.Publish.objects.filter(title="郵電出版社").first() print(publish) # 反向一對(duì)多 book_list = publish.book_list.all() print(book_list)

執(zhí)行結(jié)果

如何了解Django ORM操作

filter().filter()...

上文我們說(shuō)過(guò),是支持多個(gè)filter的,filter(<條件>).filter(<條件>)...

這種情況通常用于不確定篩選條件,但是多層篩選的情況下。

代碼

# 舉例而已,后面filter里面可以是其他 或 的條件 book1 = models.Book.objects.filter(title="<<大明帝國(guó)>>").filter(price="99") # 效果同上 book2 = models.Book.objects.filter(title="<<大明帝國(guó)>>",price="99") print(book1) print(book2)

執(zhí)行結(jié)果

如何了解Django ORM操作

到此,相信大家對(duì)“如何了解Django ORM操作”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI