日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
一篇文章帶你了解DjangoORM操作(進(jìn)階篇)

回顧

威縣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ū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話(huà)聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!

上次咱們學(xué)習(xí)了一下Django ORM的基本查詢(xún)操作。

查詢(xún)操作主要使用的是filter()方法。

我們知道filter()查詢(xún)出來(lái)的是值,如果想取第一個(gè)值需要再filter().first()才行。

還知道了get()和filter().first()的區(qū)別等等。

Django ORM的查詢(xún)還有很多,繼續(xù)來(lái)看叭!!!

查詢(xún)操作

對(duì)象.外鍵字段

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

代碼

 
 
 
 
  1. book = models.Book.objects.filter(title="<<大明帝國(guó)>>").first() 
  2. print(f"book類(lèi)型:{type(book)}") 
  3. print(f"id:{book.id}") 
  4. print(f"書(shū)名:{book.title}") 
  5. print(f"價(jià)格:{book.price}") 
  6. print(f"書(shū)名:{book.PublishDate}") 
  7. 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)系方式咋辦?

代碼

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

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

 

總結(jié)

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

反向查詢(xún)(表名__set.all())

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

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

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

代碼

 
 
 
 
  1. # 查詢(xún)郵電出版社 
  2. publish_obj = models.Publish.objects.filter(title="郵電出版社").first() 
  3. # 獲取出版社id 
  4. publish_id = publish_obj.id 
  5. # 查詢(xún)publish_id為出版社id的 
  6. book_list = models.Book.objects.filter(publish_id=publish_id) 
  7. print(book_list) 

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

 

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

代碼

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

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

 

雙下劃線跨表查詢(xún)

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

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

 

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

代碼

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

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

 

連續(xù)跨表

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

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

代碼

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

跨了book表又跨了publish表

 

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

 

values

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

代碼

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

代碼

 

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

values_list

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

代碼

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

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

 

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

related_name

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

原方式

models.py

 

代碼

 
 
 
 
  1. # 查詢(xún)郵電出版社 
  2. publish = models.Publish.objects.filter(title="郵電出版社").first() 
  3. print(publish) 
  4. # 反向一對(duì)多 
  5. book_list = publish.book_set.all() 
  6. print(book_list) 

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

 

別名方式

models.py

 

代碼

 
 
 
 
  1. # 查詢(xún)郵電出版社 
  2. publish = models.Publish.objects.filter(title="郵電出版社").first() 
  3. print(publish) 
  4. # 反向一對(duì)多 
  5. book_list = publish.book_list.all() 
  6. print(book_list) 

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

 

filter().filter()...

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

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

代碼

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

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

 

總結(jié)

本篇主要還是上篇的繼續(xù)補(bǔ)充,還是關(guān)于filter的查詢(xún)部分。

本次主要有外鍵字段類(lèi)型,反向查詢(xún)默認(rèn)使用<表名>__set,還可以使用related_name反向字段查詢(xún)。

雙下劃線可以進(jìn)行條件查詢(xún),還可以進(jìn)行跨表查詢(xú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)。


文章名稱(chēng):一篇文章帶你了解DjangoORM操作(進(jìn)階篇)
本文URL:http://m.5511xx.com/article/cogschp.html