本篇內(nèi)容主要講解“如何了解Django ORM操作”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“如何了解Django ORM操作”吧!
成都創(chuàng)新互聯(lián)公司是一家專業(yè)的成都網(wǎng)站建設(shè)公司,我們專注成都網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)絡(luò)營銷、企業(yè)網(wǎng)站建設(shè),友情鏈接,一元廣告為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設(shè)計到用戶體驗提高,創(chuàng)新互聯(lián)力求做到盡善盡美。
查詢操作
對象.外鍵字段
比如,我們拿到了一個書的信息,我們可以這樣打印他的信息。
代碼
book = models.Book.objects.filter(title="<<大明帝國>>").first() print(f"book類型:{type(book)}") print(f"id:{book.id}") print(f"書名:{book.title}") print(f"價格:{book.price}") print(f"書名:{book.PublishDate}") print(f"出版社:{book.publish}") # 外鍵字段
執(zhí)行結(jié)果
注:藍色為外鍵字段
不知道你有沒有疑問,為什么book.publish會把郵電出版社打印出來。
這個原因主要在于外鍵對象的__str__方法。
就是因為我Publish返回的是self.title,所以才能打印出來郵電出版社,如果我想打印出版社聯(lián)系方式咋辦?
代碼
print(f"出版社類型:{type(book.publish)}") ## book.publish已經(jīng)是models.Publish對象,所以可以自由調(diào)里面的屬性 print(f"出版社電話:{book.publish.phone},")
執(zhí)行結(jié)果
總結(jié)
對象.外鍵字段拿到的就是外鍵字段對象,直接就可以通過對象.外鍵字段.外鍵屬性獲取具體值。
反向查詢(表名__set.all())
上述我們是通過正向查詢的方式查詢到了書對應(yīng)的出版社具體信息。
但是如果說,我們拿到的就是一個出版社名呢?
通常情況下,你可能會這樣!
代碼
# 查詢郵電出版社 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é)果
其實,還有一種方法:通過一個對象,反向查多個對象。
代碼
publish_obj = models.Publish.objects.filter(title="郵電出版社").first() book_list = publish_obj.book_set.all() print(book_list)
執(zhí)行結(jié)果
雙下劃線跨表查詢
還是上述這個問題,通過一個出版社名,查找屬于這個出版社的圖書。
基于雙下劃線的跨表查詢,理論是更簡單的!
注:可以看到還有__contains等其他filter條件查詢,通過__跨表依然是可以通用的。
代碼
book_list = models.Book.objects.filter(publish__title="郵電出版社") print(book_list)
執(zhí)行結(jié)果
連續(xù)跨表
__不僅可以進行跨一張表,還能跨多張表。
以圖書Many作者表為例,根據(jù)出版社查詢圖書和作者多對多的信息。
代碼
ret = models.BookManyAuthor.objects.filter(book__publish__title="郵電出版社") print(ret)
跨了book表又跨了publish表
執(zhí)行結(jié)果
values
有時候,我們可能只需要一些特定的列,這時候使用values即可。
代碼
# 語法 book_list = models.Book.objects.all().values("列1","列2",...) # 示例 book_list = models.Book.objects.all().values("title","price") print(book_list)
代碼
values返回的值有點像列表套字典,但是其實本質(zhì)還是QuerySet類型。
values_list
values_list和values功能一樣,都是取相關(guān)的列,但是返回的類型格式不一樣。
代碼
book_list = models.Book.objects.all().values_list("title","price") print(book_list)
執(zhí)行結(jié)果
這個有點像列表套元組,但是其實本質(zhì)還是QuerySet。
related_name
related_name通常用于反向查詢時,替換<表名>_set。
原方式
models.py
代碼
# 查詢郵電出版社 publish = models.Publish.objects.filter(title="郵電出版社").first() print(publish) # 反向一對多 book_list = publish.book_set.all() print(book_list)
執(zhí)行結(jié)果
別名方式
models.py
代碼
# 查詢郵電出版社 publish = models.Publish.objects.filter(title="郵電出版社").first() print(publish) # 反向一對多 book_list = publish.book_list.all() print(book_list)
執(zhí)行結(jié)果
filter().filter()...
上文我們說過,是支持多個filter的,filter(<條件>).filter(<條件>)...
這種情況通常用于不確定篩選條件,但是多層篩選的情況下。
代碼
# 舉例而已,后面filter里面可以是其他 或 的條件 book1 = models.Book.objects.filter(title="<<大明帝國>>").filter(price="99") # 效果同上 book2 = models.Book.objects.filter(title="<<大明帝國>>",price="99") print(book1) print(book2)
執(zhí)行結(jié)果
到此,相信大家對“如何了解Django ORM操作”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!