新聞中心
回顧

威縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!
上次咱們學(xué)習(xí)了一下Django ORM的基本查詢操作。
查詢操作主要使用的是filter()方法。
我們知道filter()查詢出來(lái)的是值,如果想取第一個(gè)值需要再filter().first()才行。
還知道了get()和filter().first()的區(qū)別等等。
Django ORM的查詢還有很多,繼續(xù)來(lái)看叭!!!
查詢操作
對(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é)果
注:藍(lán)色為外鍵字段
不知道你有沒(méi)有疑問(wèn),為什么book.publish會(huì)把郵電出版社打印出來(lái)。
這個(gè)原因主要在于外鍵對(duì)象的__str__方法。
就是因?yàn)槲襊ublish返回的是self.title,所以才能打印出來(lái)郵電出版社,如果我想打印出版社聯(lián)系方式咋辦?
代碼
- print(f"出版社類型:{type(book.publish)}") #
- # book.publish已經(jīng)是models.Publish對(duì)象,所以可以自由調(diào)里面的屬性
- print(f"出版社電話:{book.publish.phone},")
執(zhí)行結(jié)果
總結(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é)果
其實(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é)果
雙下劃線跨表查詢
還是上述這個(gè)問(wèn)題,通過(guò)一個(gè)出版社名,查找屬于這個(gè)出版社的圖書(shū)。
基于雙下劃線的跨表查詢,理論是更簡(jiǎn)單的!
注:可以看到還有__contains等其他filter條件查詢,通過(guò)__跨表依然是可以通用的。
代碼
- book_list = models.Book.objects.filter(publish__title="郵電出版社")
- print(book_list)
執(zhí)行結(jié)果
連續(xù)跨表
__不僅可以進(jìn)行跨一張表,還能跨多張表。
以圖書(shū)Many作者表為例,根據(jù)出版社查詢圖書(shū)和作者多對(duì)多的信息。
代碼
- ret = models.BookManyAuthor.objects.filter(book__publish__title="郵電出版社")
- print(ret)
跨了book表又跨了publish表
執(zhí)行結(jié)果
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)
代碼
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é)果
這個(gè)有點(diǎn)像列表套元組,但是其實(shí)本質(zhì)還是QuerySet。
related_name
related_name通常用于反向查詢時(shí),替換<表名>_set。
原方式
models.py
代碼
- # 查詢郵電出版社
- publish = models.Publish.objects.filter(title="郵電出版社").first()
- print(publish)
- # 反向一對(duì)多
- book_list = publish.book_set.all()
- print(book_list)
執(zhí)行結(jié)果
別名方式
models.py
代碼
- # 查詢郵電出版社
- publish = models.Publish.objects.filter(title="郵電出版社").first()
- print(publish)
- # 反向一對(duì)多
- book_list = publish.book_list.all()
- print(book_list)
執(zhí)行結(jié)果
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é)果
總結(jié)
本篇主要還是上篇的繼續(xù)補(bǔ)充,還是關(guān)于filter的查詢部分。
本次主要有外鍵字段類型,反向查詢默認(rèn)使用<表名>__set,還可以使用related_name反向字段查詢。
雙下劃線可以進(jìn)行條件查詢,還可以進(jìn)行跨表查詢,還可以連續(xù)跨表,values和values_list區(qū)別。
多個(gè)filter進(jìn)行條件篩選。
如果在操作過(guò)程中有任何問(wèn)題,記得下面留言,我們看到會(huì)第一時(shí)間解決問(wèn)題。
用微笑告訴別人,今天的我比昨天強(qiáng),今后也一樣。
本文轉(zhuǎn)載自微信公眾號(hào)「Python爬蟲(chóng)與數(shù)據(jù)挖掘」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Python爬蟲(chóng)與數(shù)據(jù)挖掘公眾號(hào)。
網(wǎng)頁(yè)題目:一篇文章帶你了解DjangoORM操作(進(jìn)階篇)
轉(zhuǎn)載源于:http://fisionsoft.com.cn/article/cogschp.html


咨詢
建站咨詢
