1. 程式人生 > >F查詢與Q查詢

F查詢與Q查詢

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 物件。

from django.db.models import
Q 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")