我做下面的查詢:Django ORM查詢字段權重?
People.objects.filter(
Q(name__icontains='carolina'),
Q(state__icontains='carolina'),
Q(address__icontains='carolina'),
)[:9]
我想查詢的第一個成果是誰被命名爲「州」的人(也匹配等領域,但名頭)。問題是我認爲沒有辦法確定一個領域的「重量」或「優先級」。
有什麼想法? 謝謝!
我做下面的查詢:Django ORM查詢字段權重?
People.objects.filter(
Q(name__icontains='carolina'),
Q(state__icontains='carolina'),
Q(address__icontains='carolina'),
)[:9]
我想查詢的第一個成果是誰被命名爲「州」的人(也匹配等領域,但名頭)。問題是我認爲沒有辦法確定一個領域的「重量」或「優先級」。
有什麼想法? 謝謝!
你需要做3個查詢這個工作:
names_match = People.objects.filter(name__icontains='carolina')[:9]
states_match = People.objects.filter(state__icontains='carolina')[:9]
addresses_match = People.objects.filter(address__icontains='carolina')[:9]
all_objects = list(names_match) + list(states_match) + list(addresses_match)
all_objects = all_objects[:9]
這種方法存在兩個問題,它們很容易處理:
names_match
已包含足夠的項目,該怎麼辦)。對於情況2,他只需在合併列表之前檢查重複項。 –
另外 - 一旦有足夠*的結果,請小心避免第二次或第三次查詢 - 在確定您是否真的有足夠的數據之前,您需要檢查重複項。 –
對於第二個或第三個查詢,他可以用前面的結果做一個「NOT IN」。這應該解決很多頭痛問題。 –
這應該工作:
qs = People.objects.filter(name__icontains='carolina') | People.objects.filter(Q(state__icontains = 'carolina'), Q(address__icontains='carolina')).distinct()
qs = list(qs)[:9]
或者,如果你想要一個純粹的重複空閒列表:
qs = list(set(qs))[:9] #for a duplicate free list
+1多米尼克羅傑斯的回答更清晰的方式imo – user2298943
他們沒有,客戶端改變了主意,但3個查詢是一個不錯的辦法。 –