1. 程式人生 > >Python數據庫查詢之組合條件查詢-F&Q查詢

Python數據庫查詢之組合條件查詢-F&Q查詢

不一定 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查詢