Django4.0 執(zhí)行查詢-通過Q對象完成復(fù)雜查詢

2022-03-16 17:33 更新

在類似 ?filter()? 中,查詢使用的關(guān)鍵字參數(shù)是通過?"AND"?連接起來的。如果你要執(zhí)行更復(fù)雜的查詢(例如,由 ?OR? 語句連接的查詢),你可以使用 ?Q ?對象。

??對象?(django.db.models.Q)?是一個用于封裝關(guān)鍵字參數(shù)集合的對象。

例如,這個 ??對象封裝了一個 ?LIKE ?查詢:

from django.db.models import Q
Q(question__startswith='What')

?Q ?對象能通過 & 和 ?|? 操作符連接起來。當(dāng)操作符被用于兩個 ?Q ?對象之間時會生成一個新的 ?Q ?對象。
例如,該語句生成一個 ?Q ?對象,表示兩個 ?"question_startswith"? 查詢語句之間的 ?"OR"? 關(guān)系:

Q(question__startswith='Who') | Q(question__startswith='What')

這等價于以下 SQL ?WHERE ?語句:

WHERE question LIKE 'Who%' OR question LIKE 'What%'

你能通過 ?&? 和 ?|? 操作符和括號分組,組合任意復(fù)雜度的語句。當(dāng)然, ?Q? 對象也可通過 ?~? 操作符反轉(zhuǎn),允許在組合查詢中組合普通查詢或反向 ?(NOT)? 查詢:

Q(question__startswith='Who') | ~Q(pub_date__year=2005)

每個接受關(guān)鍵字參數(shù)的查詢函數(shù) (例如 ?filter()?, ?exclude()?, ?get()?) 也同時接受一個或多個 ?Q ?對象作為未命名的參數(shù)。若你為查詢函數(shù)提供了多個 ?Q ?對象參數(shù),這些參數(shù)會通過 ?"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')

查詢函數(shù)能混合使用 ?Q? 對象和關(guān)鍵字參數(shù)。所有提供給查詢函數(shù)的參數(shù)(即關(guān)鍵字參數(shù)或 ?Q ?對象)均通過 ?"AND"? 連接。然而,若提供了 ?Q ?對象,那么它必須位于所有關(guān)鍵字參數(shù)之前。例如:

Poll.objects.get(
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
    question__startswith='Who',
)

相當(dāng)于前面的例子,但這是無效的:

# INVALID QUERY
Poll.objects.get(
    question__startswith='Who',
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號