一、F查詢和Q查詢
F查詢:
在上面所有的例子中,我們構造的過濾器都只是將字段值與某個常量做比較。如果我們要對兩個字段的值做比較,那該怎么做呢?
Django 提供 F() 來做這樣的比較。F() 的實例可以在查詢中引用字段,來比較同一個 model 實例中兩個不同字段的值。
1、查看評論數大於閱讀數的書
from django.db.models import F,Q print(models.Book.objects.filter(commentNum__gt=F("readNum")))
2、修改操作也可以使用F函數,比如將id大於1的所有的書的價格漲價100元
print(models.Book.objects.filter(nid__gt=1).update(price=F("price")+100))
3、Django 支持 F() 對象之間以及 F() 對象和常數之間的加減乘除和取模的操作。
# 查詢評論數大於收藏數2倍的書籍 models.Book.objects.filter(commnetNum__lt=F('keepNum')*2)
Q查詢:
filter() 等方法中的關鍵字參數查詢都是一起進行“AND” 的。 如果你需要執行更復雜的查詢(例如OR 語句),你可以使用Q 對象。
1、查詢id大於1並且評論數大於100的書
print(models.Book.objects.filter(nid__gt=1,commentNum__gt=100)) print(models.Book.objects.filter(nid__gt=1).filter(commentNum__gt=100)) print(models.Book.objects.filter(Q(nid__gt=1)&Q(commentNum__gt=100)))
2、查詢評論數大於100或者閱讀數小於200的書
print(models.Book.objects.filter(Q(commentNum__gt=100)|Q(readNum__lt=200))) Q 對象可以使用& 和| 操作符組合起來。當一個操作符在兩個Q 對象上使用時,它產生一個新的Q 對象。
3、查詢年份等於2017年或者價格大於200的書
print(models.Book.objects.filter(Q(publishDdata__year=2017)|Q(price__gt=200)))
4、查詢年份不是2017年或者價格大於200的書
print(models.Book.objects.filter(~Q(publishDdata__year=2017)&Q(price__gt=200)))
注意:
查詢函數可以混合使用Q 對象和關鍵字參數。所有提供給查詢函數的參數(關鍵字參數或Q 對象)都將"AND”在一起。但是,如果出現Q 對象,它必須位於所有關鍵字參數的前面。例如:
bookList=models.Book.objects.filter(Q(publishDate__year=2016) | Q(publishDate__year=2017), title__icontains="python" )