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


F查詢(取字段的值)

關於查詢我們知道有filter( ) ,values( ) , get( ) ,exclude( ) ,如果是聚合分組,還會用到aggregate和annotate,甚至還有萬能的雙下划線,但是如果有這樣一個需求,查詢a表中的aa字段數值大於a表中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()返回的結果不一定是數字,也可以是字符串,比如,a和b是兩張表

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=10000))

 

延伸:

因為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)  # 這句話表明了filter后面可以跟的參數,一個是字典,另一種就是Q 對象

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM