Python數據庫查詢之組合條件查詢-F&Q查詢
阿新 • • 發佈:2017-10-28
不一定 ann 不用 pre cnblogs all 其他 port annotate
就可以應用我們寫在字典中的參數了
F查詢(取字段的值)
關於查詢我們知道有filter( ) ,values( ) , get( ) ,exclude( ) ,如果是聚合分組,還會用到aggregate和annotate,甚至還有萬能的雙下劃線,但是如果有這樣一個需求,查詢a表中的aa字段數值大於b表中bb字段數值,應該怎麽做呢,Django提供一個F表達式來支持這種操作
首先應該導入模塊:
from django.db.models import F
a.objects.filter(aa__gt=F(‘bb‘))
再舉一個簡單的例子,修改表中的值,為每一個a表中的price字段的值,加20
a.objects.all().update(price=F(‘price‘)+20)
如果沒有F 對象,這種需求是無法實現的
Django支持對F()對象進行加、減、乘、除、取模、冪計算等操作
F()括號中還支持雙下劃線進行連表查詢,F()返回的結果不一定是數字,也可以是字符串,比如
from django.db.models import F
a.objects.filter(name=F(‘b__name‘))
Q查詢,相比F查詢,Q組合查詢應用十分廣泛,甚至你的查詢只需要一個filter和Q,就夠了
需導入
from django.db.models import Q
本來filter( ) 方法中的關鍵字,都是按‘與’的關系進行查找的,如果你需要 ‘或’ 的關系,你就得用Q了
Q對象用於封裝一組關鍵字參數,這些關鍵字參數就可以作為filter()的參數
重點是Q對象可以使用 | 或者 & 連接成一個新的Q對象,還支持用 ~ 符號取反
需要註意:Q對象可以和其他關鍵字參數一起作為filter的參數,但是Q對象必須放在一個位置
示例:查詢a表中id大於4,以‘張’開頭,或者價格大於10000的數據
a.objects.filter((Q(name__startwith=‘張‘),Q(id__gt=4))|Q(price__gt=1000))
延伸:
因為filter接收的參數是關鍵字參數,所以在實際項目應用中,我們可以單獨處理這個關鍵字參數,比如寫成一個字典dict,然後filter(**dict)
如果是Q對象,就不用**了
用Q對象做字典的元素時,如果是‘或’的關系,需要這樣寫
con = Q() con.connector = ‘OR‘ key = ...... val = ....... con.children.append((key,val)) dict = {‘key2’:‘val2’}
data_list = a.objects.filter(**dict).filter(con)
Python數據庫查詢之組合條件查詢-F&Q查詢