F查詢與Q查詢
阿新 • • 發佈:2018-11-09
F查詢
如果我們要對兩個欄位的值做比較,那該怎麼做呢?
Django 提供 F() 來做這樣的比較。F() 的例項可以在查詢中引用欄位,來比較同一個 model 例項中兩個不同欄位的值。
# 查詢評論數大於收藏數的書籍 from django.db.models import F Book.objects.filter(commnetNum__gt=F('keepNum'))
Django 支援 F() 物件之間以及 F() 物件和常數之間的加減乘除和取模的操作。
# 查詢評論數大於收藏數2倍的書籍 Book.objects.filter(commnetNum__gt=F('keepNum')*2)
修改操作也可以使用F函式,比如將每一本書的價格提高30元:
Book.objects.all().update(price=F("price")+30)
Q查詢
filter() 等方法中的關鍵字引數查詢都是一起進行“AND” 的。 如果你需要執行更復雜的查詢(例如OR 語句),你可以使用Q 物件。
Q 物件可以使用& 和| 操作符組合起來。當一個操作符在兩個Q 物件上使用時,它產生一個新的Q 物件。
from django.db.models importQ bookList=Book.objects.filter(
Q(authors__name="yuan")|Q(authors__name="egon")) #等同於WHERE name ="yuan" OR name ="egon"
你可以組合& 和| 操作符以及使用括號進行分組來編寫任意複雜的Q 物件。同時,Q 物件可以使用~ 操作符取反,這允許組合正常的查詢和取反(NOT) 查詢:
bookList=Book.objects.filter(
Q(authors__name="yuan") & ~Q(publishDate__year=2017)).values_list("title")
查詢函式可以混合使用Q 物件和關鍵字引數。所有提供給查詢函式的引數(關鍵字引數或Q 物件)都將"AND”在一起。但是,如果出現Q 物件,它必須位於所有關鍵字引數的前面。例如:
bookList=Book.objects.filter(Q(publishDate__year=2016) | Q(publishDate__year=2017),
title__icontains="python")