1. 程式人生 > 其它 >14Django存在關聯關係的反向查詢

14Django存在關聯關係的反向查詢

1. Model的反向查詢

Django 中的每一中關聯關係都可以是實現反向查詢,我們對三種關係的關聯反向查詢依次進行介紹,其實只要掌握了其中一種,大家就可以領悟反向的查詢是如何進行應用的。

1) 多對一關係的反向查詢

  1. #通過多查一建立書籍書籍例項物件(正向查詢)
  2. In [12]: from index.models import PubName,Book
  3. In [13]: book1=Book.objects.get(id=1)
  4. In [14]: print(book1.title,"的出版社是",book1.pub.pubname)#建立外來鍵關聯的欄位
  5. #輸出結果:Python Django 的出版社是 清華出版社
  6. #通過一查多創建出版社例項物件(反向查詢)
  7. In [16]: pubname1=PubName.objects.get(pubname="C語言中文網出版")
  8. In [17]: books=pubname1.book_set.all()
  9. In [18]: for book in books:
  10. ...: print(book.title)
  11. #輸出結果: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) 多對多關係的反向查詢

我們知道一個作者可以出版多本圖書,同時一本圖書可以被多名作者同時編寫。這種關係就是多對多的關係,那麼它的多對多關係又是如何實現的呢?

  1. #通過Author(Luncy)查詢對應的所有的Books
  2. In [5]: from index.models import Book,Author
  3. In [6]: author=Author.objects.get(id=1)
  4. In [7]: author.books.all()
  5. Out[7]: <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>, <Book: Book object (4)>, <Book: Book object (5)>]>
  6. #通過book(Python Django)的書籍查詢其對應的所有的 Authors
  7. In [8]: book=Book.objects.get(id=1)
  8. In [9]: book.author_set.all()
  9. Out[9]: <QuerySet [<Author: 作家:Luncy>, <Author: 作家:Tom>]>
  10. In [10]: book.author_set.add(Author.objects.get(name="Xiaolong"))#為id=1書籍新增作者Xionglong

3) 一對一關係的反向查詢

一對一的反向查詢比較特殊,它的管理器是一個單一的物件麼不是物件的集合密,且名稱變成了小寫的 Model 名。下面我們通過舉例進行說明:

  1. In [1]: from index.models import UserInfo,ExtendUserinfo
  2. In [2]: user=UserInfo.objects.get(id=2)
  3. In [3]: user.extenduserinfo
  4. Out[3]: <ExtendUserinfo: ExtendUserinfo object (1)>

我們知道 ExtendUserinfo 的 user 欄位與 UserInfo 存在一對一的關聯關係,所以反向查詢是利用 UserInfo 的例項物件來查詢 ExtendUserinfo Model 中與其匹配的物件。

提示:所謂反向查詢可以簡單理解為在建立關聯關係的兩個 Model 之間,利用沒有關聯關係欄位的 Model 來查詢另一個有關聯關係欄位的 Model。一般的操作時首先例項化物件,然後根據不同的關聯關係選用不同的方法,從而實現查詢。

2. 跨關聯關係查詢

那我們考慮一下,有沒有這種場景,在存在關聯關係的兩個 Model 之間進行查詢的時候,不能只考慮其中一個 Model,而需要滿足兩個 Model 的要求呢。比如,要查詢“c語言中網”出版了哪幾本圖書,我們應該如何通過 Django 查詢呢?Django 為我們提供了一種簡單的方法,也就是跨關聯關係的查詢方式,這種方式使用雙下畫線的與關聯的 Model 的欄位名稱組合在一起,並給出合適的條件就可以完成查詢。例項如下:

純文字複製
  1. #“c語言中網”出版了哪幾本圖書
  2. from index.models import PubName,Book
  3. In [1]: Book.objects.filter(pub__pubname__contains="c語言中文網出版")#注意是雙下畫線哦
  4. Out[1]: <QuerySet [<Book: Book object (4)>, <Book: Book object (5)>]>


同時 Django 也支援反向的關聯查詢,只需要使用關聯 Model 的小寫名稱即可,例項如下:

純文字複製
  1. #查詢價格大於等於30的書籍
  2. In [2]: PubName.objects.filter(book__price__gte=60)
  3. Out[2]: <QuerySet [<PubName: PubName object (9)>]>

本節詳細介紹瞭如何使用多表關聯關係查詢,這在實際的開發工作中很重要,所以大家要重點掌握本節知識。