11Django F物件和Q物件查詢詳解
1. F物件查詢
F物件主要用於模型類的 A 欄位屬性與 B 欄位屬性兩者的比較,即操作資料庫中某一列的值。通常是對資料庫中的欄位值在不獲取的情況下進行操作。F 物件內建在資料包django.db.models
中,所以使用時需要提前匯入。如下所示:
from django.db.models import F
它的語法格式如下所示:
- from django.db.models import F
- F('欄位名')
在使用F物件進行查詢的時候需要注意:一個 F() 物件代表了一個 Model 的欄位的值;F 物件可以在沒有實際訪問資料庫獲取資料值的情況下對欄位的值進行引用。
Django 支援對 F物件引用欄位的算術運算操作,並且運算子兩邊可以是具體的數值或者是另一個 F 物件,下面我們通過例項進一步認識 F 物件。
- from django.db.models import F
- from index.models import Book
- #給Book所有例項價格(retail_price)漲價20元
- Book.objects.all().update(retail_price=F('retail_price')+20) #獲取該列所有值並加20
- #利用傳統的方法實現漲價20元
- books = models.Book.objects.all()
- for book in books:
- book.update(retail_price=book.retail_price+20)
- book.save()
通過上述例項可以看出,使用 F 物件相對傳統的方法要簡單的多。那麼如何通過 F 物件實現兩個欄位值(列)之間的比較呢?例項如下所示:
- #對資料庫中兩個欄位的值進行比較,列出哪兒些書的零售價高於定價
- books = Book.objects.filter(retail_price__gt=F('price'))
- for book in books:
- print(book.title, '定價:', book.price, '現價:', book.retail_price)
2. Q物件查詢
Q 物件相比 F 物件更加複雜一點,它主要應用於包含邏輯運算的複雜查詢。Q 物件把關鍵字引數封裝在一起,並傳遞給 filter、exclude、get 等查詢的方法。多個 Q 物件之間可以使用&
|
運算子組合(符號分別表示與和或的關係),從而產生一個新的 Q 物件。當然也可以使用~
(非)運算子來取反,從而實現NOT查詢。Q 物件的匯入方式如下所示:
from django.db.models import Q
它和 Q 物件位於一個數據包裡面。常用語法格式如下:
- from django.db.models import Q
- Q(條件1)|Q(條件2) # 條件1成立或條件2成立
- Q(條件1)&Q(條件2) # 條件1和條件2同時成立
- Q(條件1)&~Q(條件2) # 條件1成立且條件2不成立
- #...等
最簡單的 Q 物件的使用方法是將單個欄位類屬性作為引數進行查詢,例項如下:
- #查詢 書籍的title中包含有字母P的
- In [1]: from index.models import Book
- In [2]: from django.db.models import Q
- In [4]: Book.objects.filter(Q(title__contains="P"))
- Out[4]: <QuerySet [<Book: Book object (1)>]>
但時 Q 物件在實際的應用中往往是較為複雜的,和常和邏輯運算子一起使用,如下所示:
- #多個Q物件組合
- from index.models import Book
- from django.db.models import Q
- #查詢c語言中文網出版的書或價格低於35的書
- Book.objects.filter(Q(retail_price__lt=35)|Q(pub_id='2'))#兩個Q物件是或者的邏輯關係
- #查詢不是c語言中文出版的書且價格低於45的書
- Book.objects.filter(Q(retail_price__lt=45)&~Q(pub_id='2'))#條件1成立條件2不成立
注意此時的的欄位為pub_id 因為此此段建立一對多的關聯關係,不可以直接使用C語言中文網,不然會發生如下報錯:
ValueError: invalid literal for int() with base 10: 'c語言中文網出版'
報錯原因是:欄位的條件約束為int型別,但是給了一個字串型別。
Q 物件也可以與類屬性的欄位名組合在一起使用,但是在這種情況下,Django 規定,Q 物件必須放在前面,示例如下:
純文字複製
- Book.objects.filter(Q(price__lte=100),title__icontains="p")#組合使用
- <QuerySet [<Book: Book object (1)>]>
本節詳解介紹了 F 與 Q 物件的查詢方法以及是如何進行應用的,熟練掌握它們會給我們在開發過程中帶來事半功倍的效果,能夠大量簡化我們的工作量。所以我們要儘可能的學習並掌握它們。
原文:http://c.biancheng.net/view/7693.html