14Django存在關聯關係的反向查詢
1. Model的反向查詢
Django 中的每一中關聯關係都可以是實現反向查詢,我們對三種關係的關聯反向查詢依次進行介紹,其實只要掌握了其中一種,大家就可以領悟反向的查詢是如何進行應用的。
1) 多對一關係的反向查詢
- #通過多查一建立書籍書籍例項物件(正向查詢)
- In [12]: from index.models import PubName,Book
- In [13]: book1=Book.objects.get(id=1)
- In [14]: print(book1.title,"的出版社是",book1.pub.pubname)#建立外來鍵關聯的欄位
- #輸出結果:Python Django 的出版社是 清華出版社
- #通過一查多創建出版社例項物件(反向查詢)
- In [16]: pubname1=PubName.objects.get(pubname="C語言中文網出版")
- In [17]: books=pubname1.book_set.all()
- In [18]: for book in books:
- ...: print(book.title)
- #輸出結果:Django Flask
通過上述的反向查詢可以得知,對於每一個 PubName 的例項物件都自動地會有一個管理器可以用來查詢與它關聯的 Book 例項物件。在預設情況下,管理器的名稱是“小寫模型名_set”。
在上例中管理器就是 book_set,我們利用它就可以實現一對多的反向查詢。book_set 管理器同查詢管理器 objects 一樣可以呼叫相應的 API 介面。如下所示,不過它都對應的使用場景也不能亂用哦。
xxxfiled.book_set.all() #查詢所有資料 xxxfiled.book_set.filter() #查詢滿足特定條件的資料 author.book_set.create(book) # 建立新書並聯作用author author.book_set.add(book) #新增已有的書為當前作者author author.book_set.clear() #刪除author所有並聯的書
2) 多對多關係的反向查詢
我們知道一個作者可以出版多本圖書,同時一本圖書可以被多名作者同時編寫。這種關係就是多對多的關係,那麼它的多對多關係又是如何實現的呢?
- #通過Author(Luncy)查詢對應的所有的Books
- In [5]: from index.models import Book,Author
- In [6]: author=Author.objects.get(id=1)
- In [7]: author.books.all()
- Out[7]: <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>, <Book: Book object (4)>, <Book: Book object (5)>]>
- #通過book(Python Django)的書籍查詢其對應的所有的 Authors
- In [8]: book=Book.objects.get(id=1)
- In [9]: book.author_set.all()
- Out[9]: <QuerySet [<Author: 作家:Luncy>, <Author: 作家:Tom>]>
- In [10]: book.author_set.add(Author.objects.get(name="Xiaolong"))#為id=1書籍新增作者Xionglong
3) 一對一關係的反向查詢
一對一的反向查詢比較特殊,它的管理器是一個單一的物件麼不是物件的集合密,且名稱變成了小寫的 Model 名。下面我們通過舉例進行說明:
- In [1]: from index.models import UserInfo,ExtendUserinfo
- In [2]: user=UserInfo.objects.get(id=2)
- In [3]: user.extenduserinfo
- Out[3]: <ExtendUserinfo: ExtendUserinfo object (1)>
我們知道 ExtendUserinfo 的 user 欄位與 UserInfo 存在一對一的關聯關係,所以反向查詢是利用 UserInfo 的例項物件來查詢 ExtendUserinfo Model 中與其匹配的物件。
提示:所謂反向查詢可以簡單理解為在建立關聯關係的兩個 Model 之間,利用沒有關聯關係欄位的 Model 來查詢另一個有關聯關係欄位的 Model。一般的操作時首先例項化物件,然後根據不同的關聯關係選用不同的方法,從而實現查詢。
2. 跨關聯關係查詢
那我們考慮一下,有沒有這種場景,在存在關聯關係的兩個 Model 之間進行查詢的時候,不能只考慮其中一個 Model,而需要滿足兩個 Model 的要求呢。比如,要查詢“c語言中網”出版了哪幾本圖書,我們應該如何通過 Django 查詢呢?Django 為我們提供了一種簡單的方法,也就是跨關聯關係的查詢方式,這種方式使用雙下畫線的與關聯的 Model 的欄位名稱組合在一起,並給出合適的條件就可以完成查詢。例項如下:
純文字複製
- #“c語言中網”出版了哪幾本圖書
- from index.models import PubName,Book
- In [1]: Book.objects.filter(pub__pubname__contains="c語言中文網出版")#注意是雙下畫線哦
- Out[1]: <QuerySet [<Book: Book object (4)>, <Book: Book object (5)>]>
同時 Django 也支援反向的關聯查詢,只需要使用關聯 Model 的小寫名稱即可,例項如下:
純文字複製
- #查詢價格大於等於30的書籍
- In [2]: PubName.objects.filter(book__price__gte=60)
- Out[2]: <QuerySet [<PubName: PubName object (9)>]>
本節詳細介紹瞭如何使用多表關聯關係查詢,這在實際的開發工作中很重要,所以大家要重點掌握本節知識。