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

2022-03-16 17:33 更新

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

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

例如,這個(gè) ??對(duì)象封裝了一個(gè) ?LIKE ?查詢:

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

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

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

這等價(jià)于以下 SQL ?WHERE ?語(yǔ)句:

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

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

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

每個(gè)接受關(guān)鍵字參數(shù)的查詢函數(shù) (例如 ?filter()?, ?exclude()?, ?get()?) 也同時(shí)接受一個(gè)或多個(gè) ?Q ?對(duì)象作為未命名的參數(shù)。若你為查詢函數(shù)提供了多個(gè) ?Q ?對(duì)象參數(shù),這些參數(shù)會(huì)通過(guò) ?"AND"? 連接。例如:

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

等價(jià)于以下 SQL語(yǔ)句:

SELECT * from polls WHERE question LIKE 'Who%'
    AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')

查詢函數(shù)能混合使用 ?Q? 對(duì)象和關(guān)鍵字參數(shù)。所有提供給查詢函數(shù)的參數(shù)(即關(guān)鍵字參數(shù)或 ?Q ?對(duì)象)均通過(guò) ?"AND"? 連接。然而,若提供了 ?Q ?對(duì)象,那么它必須位于所有關(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)于前面的例子,但這是無(wú)效的:

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)