2013-05-22 15 views
1

我想以此來顯示(作爲一個排名),誰擁有更多的共同點與登錄用戶的用戶 我有這樣的代碼:Django的數量相匹配的查詢與包含

me = User.objects.get(pk=sesion) 

keywords = me.likes 
result = [] 
for keyword in keywords.split(','): 
    result += list(User.objects.filter(likes__icontains=keyword).exclude(id=sesion)) 

但是這個代碼所示是這樣的:

Username A 
Username B 
Username A 
Username B 
Username B 
Username C 

我想是這樣的:

Username B 
Username A 
Username C 

因爲用戶「B」與「我」有更多共同之處。

有誰知道我該怎麼做?

感謝

+0

不能真正做到這一點與全文搜索...你有唯一的選擇是重新排序列表中的python ... –

+0

如果您製作了'Like'模型,並將其鏈接爲來自'User'的M2M字段,則這將更容易 –

+0

「likes」是關鍵字,類似標籤。 –

回答

2

可以使用Counter類:

>>> Counter(result).most_common() 
[('b', 3), ('a', 2), ('c', 1)] 

或者,使用Count,讓數據庫做的東西:

User.objects.filter(likes__icontains=keyword) 
      .exclude(id=sesion) 
      .annotate(total_likes=Count('likes')) 
      .order_by('total_likes') 
+0

謝謝,櫃檯類作品完美! –

+0

+1! :-) –

1

比方說,爲了討論各種情形,你不要沒有可能製造出另一款車型。

你可以做的則是這樣的:

keywords = [word.lower() for word in me.likes.split(',')] 
result = User.objects.filter(likes__in=keywords) 
        .exclude(id=sesion) 
        .annotate(most_likes=Count('likes')) 
        .order_by('most_likes') 

這將節省的查詢集的評估在for你有每個關鍵字。 你正在評估查詢集當你在做[]圍繞User.objects...

+0

喜歡是「標籤」,他們在一個領域是這樣的:「食物,Python,開發,其他,等等......」 –

+1

@MarcosAguayo好吧,我的方式仍然有效。 :) –

相關問題