django使用Q進行複雜查詢

2021-08-18 01:28:05 字數 1723 閱讀 2564

使用q 物件進行複雜的查詢¶

filter() 等方法中的關鍵字引數查詢都是一起進行「and」 的。 如果你需要執行更複雜的查詢(例如or 語句),你可以使用q 物件。

q 物件 (django.db.models.q) 物件用於封裝一組關鍵字引數。這些關鍵字引數就是上文「字段查詢」 中所提及的那些。

例如,下面的q 物件封裝乙個like 查詢:

from django.db.models import q

q(question__startswith='what')

q 物件可以使用& 和| 操作符組合起來。當乙個操作符在兩個q 物件上使用時,它產生乙個新的q 物件。

例如,下面的語句產生乙個q 物件,表示兩個"question__startswith" 查詢的「or」 :

q(question__startswith='who') | q(question__startswith='what')

它等同於下面的sql where 子句:

where question like 'who%' or question like 'what%'

你可以組合& 和| 操作符以及使用括號進行分組來編寫任意複雜的q 物件。同時,q 物件可以使用~ 操作符取反,這允許組合正常的查詢和取反(not) 查詢:

q(question__startswith='who') | ~q(pub_date__year=2005)

每個接受關鍵字引數的查詢函式(例如filter()、exclude()、get())都可以傳遞乙個或多個q 物件作為位置(不帶名的)引數。如果乙個查詢函式有多個q 物件引數,這些引數的邏輯關係為「and"。例如:

poll.objects.get(

q(question__startswith='who'),

q(pub_date=date(2005, 5, 2)) | q(pub_date=date(2005, 5, 6))

)... 大體上可以翻譯成這個sql:

select * from polls where question like 'who%'

and (pub_date = '2005-05-02' or pub_date = '2005-05-06')

查詢函式可以混合使用q 物件和關鍵字引數。所有提供給查詢函式的引數(關鍵字引數或q 物件)都將"and」在一起。但是,如果出現q 物件,它必須位於所有關鍵字引數的前面。例如:

poll.objects.get(

q(pub_date=date(2005, 5, 2)) | q(pub_date=date(2005, 5, 6)),

question__startswith='who')

... 是乙個合法的查詢,等同於前面的例子;但是:

# invalid query

poll.objects.get(

question__startswith='who',

q(pub_date=date(2005, 5, 2)) | q(pub_date=date(2005, 5, 6)))

... 是不合法的。

使用filter

user.objects.filter(q(name=username) | q(email=email))

等同sql

select * from user where name='username' or email='email'

Django之F和Q查詢

當一般的查詢語句已經無法滿足我們的需求時,django為我們提供了f和q複雜查詢語句。假設場景一 老闆說對資料庫中所有的商品,在原 的基礎 價10元,你該怎麼做?場景二 我要查詢乙個名字叫 年齡是18歲,或者名字是yyy,年齡是是19歲的人,你該怎麼寫你的orm語句?一 f查詢 1 2 3 4 fr...

Django之F和Q查詢

當一般的查詢語句已經無法滿足我們的需求時,django為我們提供了f和q複雜查詢語句。假設場景一 老闆說對資料庫中所有的商品,在原 的基礎 價10元,你該怎麼做?場景二 我要查詢乙個名字叫 年齡是18歲,或者名字是yyy,年齡是是19歲的人,你該怎麼寫你的orm語句?一 f查詢 1 2 3 4 fr...

django資料庫Q查詢

要查詢的日誌表 選擇日誌中特定使用者名稱,並且操作時間在start date與end date之間的表項 查詢語句如下 chosed user logs.objects.filter q log account num current user.account num q deal time gte...