2016-09-30 82 views
0

目前我有一個非常簡單的搜索選項,它可以瀏覽我的頁面,並通過幾個字段查找請求的查詢。如果我在其中輸入一個單詞,它就可以正常工作,但是如果我在搜索查詢中輸入多個單詞,即使單個頁面包含所有屬性,也不會收到任何內容。例如,如果我搜索test admin,即使有一個包含標題測試的頁面,內容測試和作者管理員也不會收到空查詢。有沒有一種方法可以擴展搜索以單獨查找搜索查詢中的每個單詞?如何在Django中進行Q查找查找多個值

# Fetch all pages and sort them alphabetically 
queryset = Page.objects.all().filter(archived=False).order_by("title") 

# Get search query if applicable 
query = request.GET.get("q") 
if query: 
    queryset = queryset.filter(
     Q(title__icontains=query) | 
     Q(content__icontains=query) | 
     Q(user__username__icontains=query) | 
     Q(user__first_name__icontains=query) | 
     Q(user__last_name__icontains=query) 
    ).distinct() 

回答

1

你問的東西,像下面這樣,在你每個單詞的查詢過濾器:

import operator 

queryset = Page.objects.all().filter(archived=False).order_by("title") 

query = request.GET.get("q") 
if query: 
    words = query.split() 
    fields = ["title__icontains", "content__icontains", "user__username__contains", 
       "user__first_name__icontains", "user__last_name__icontains"] 

    q_expression = [Q(f,w) for f in fields for w in words] 
    queryset = queryset.filter(reduce(operator.or_, q_expression))\ 
         .distinct() 

然而,在這一點上做搜索這種方式得到一點點凌亂。如果您的應用程序增長並且您需要搜索多個模型,請考慮查看外部搜索包,如。

+0

好了,花了幾天的時間在這個問題上停滯不前,我決定用一個包來代替。 Haystack似乎完美地完成了這項工作。我對使用軟件包猶豫不決的原因是,這個項目也是我自己從頭開始學習django並自行開發應用程序的方式。然而,搜索整個網站及其所有應用程序的內容是非常複雜的,現在我將使用pacakge,稍後留下搜索和索引。謝謝你的建議。 – Ablivion