2016-12-15 47 views
0

我目前正在尋找我的Django網站,並且想要查詢,然後查看它在帖子名稱和說明中出現的次數,並返回帶有查詢出現的帖子的結果最上面(即如果我搜索「汽車」有5次提及的車的帖子應該出現在提到「汽車」的帖子之前)。按總髮生次數排序篩選結果

這裏是我的views.py:

def stack_list(request, query): 
    context_dict = {} 

    stacks_list = Stack.objects.filter(
     Q(name__icontains=query) | 
     Q(description__icontains=query) 
    ).annotate(total_occurance=Count('name')+Count('description') 
    ).order_by('total_occurance').distinct() 

    context_dict['stacks_list'] = stacks_list 

    return render(request, 'stack/index_search_results.html', context_dict) 

和我的html:

{% for stack in stacks_list %} 
    <p>{{ stack.name }} 
    {{ stack.description }}</p> 
{% endfor %} 

然而,當我嘗試查詢,它不會將其安排在降序排列。關於我要去哪裏的任何想法都是錯誤的?

+0

它是按升序排列嗎?還是沒有訂購? –

+0

它似乎沒有被排序 – ng150716

+0

嘗試刪除'.distinct()'。當你使用distinct和order_by時,似乎有一個問題。 (https://docs.djangoproject.com/en/1.10/ref/models/querysets/#distinct) –

回答

0

爲什麼不使用ad hoc工具進行搜索?例如,Django Postgres full text searchDjango Haystack用於更復雜的搜索和刻面(在我看來,這個工具有一些缺點 - 所以,當我使用elasticsearch時,我使用了Elasticsearch DSL python庫)。希望它有幫助,對不起,如果你爲了某種教育原因嘗試解決這種情況。

+0

是的,我正在調查乾草堆,謝謝對於其他選項,儘管我現在肯定會看穿它們。我在搜索時有點小氣,但是在使用第三部分工具如干草堆或Elasticsearch DSL與視圖中的過濾方面有很大區別(在大型站點中)? – ng150716

+0

是的,當然。像elasticsearch或sphinx這樣的搜索引擎爲您提供更多的靈活性和強大的查詢功能,很多指標,過濾器,排序選項,聚合。最重要的是,它對搜索結果進行評分。但是在小型項目中,它可能是redurdant,並且很難管理引擎服務器,所以我建議嘗試django的全文搜索suport for postgres。在大型項目中,你絕對應該使用單獨的解決方案。 –

+0

'''Stack.objects.filter( Q(name__icontains =查詢)| Q(description__icontains =查詢) ).annotate( name_occurance =計數( '姓名'), desc_occurance =計數( '描述'), total_occurance = Sum('name_occurance','desc_occurance') ).order_by('total_occurance')''' –