2013-07-31 26 views
0

我做下面的查詢:Django ORM查詢字段權重?

People.objects.filter(
    Q(name__icontains='carolina'), 
    Q(state__icontains='carolina'), 
    Q(address__icontains='carolina'), 
)[:9] 

我想查詢的第一個成果是誰被命名爲「州」的人(也匹配等領域,但名頭)。問題是我認爲沒有辦法確定一個領域的「重量」或「優先級」。

有什麼想法? 謝謝!

+0

他們沒有,客戶端改變了主意,但3個查詢是一個不錯的辦法。 –

回答

2

你需要做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] 

這種方法存在兩個問題,它們很容易處理:

  1. 它做了不必要的查詢(如果names_match已包含足夠的項目,該怎麼辦)。
  2. 它允許重複(如果有人在北卡羅萊納州被稱爲卡羅萊納州?)
+0

對於情況2,他只需在合併列表之前檢查重複項。 –

+0

另外 - 一旦有足夠*的結果,請小心避免第二次或第三次查詢 - 在確定您是否真的有足夠的數據之前,您需要檢查重複項。 –

+0

對於第二個或第三個查詢,他可以用前面的結果做一個「NOT IN」。這應該解決很多頭痛問題。 –

1

這應該工作:

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

+1多米尼克羅傑斯的回答更清晰的方式imo – user2298943