2013-01-25 36 views
0

鑑於搜索條件「big file larger desk」,我將如何搜索1)任何結果;和2)所有的結果。Django db search keywords,not exact text

我目前在做搜索是:

results = Path.objects.filter(path__icontains=search) 

我需要做的是沿着線的東西:

results = Path.objects.filter(path__icontains=search.split()) 

我會怎麼做這兩種? (OR或AND)

回答

1

你需要知道的第一件事情是,你實際上並沒有進入數據庫,當你過濾,所以你可以做不會失去太多的表現過濾多次,第一種方法可以是:

results = Path.objects.all() 
for s in search.split(): 
    results = results.filter(path__icontains = s) 

這是和ANS您可以使用類似的方法進行或。

+4

這不會像過帳一樣工作;您需要重新分配過濾器調用的結果給自己。 'results = results.filter(...)' –

0

建立一個列表理解和使用的減少功能:

keywords = search.strip().split() 
list_path_qs = [Q(path__icontains=x) for x in keywords] 
final_q = reduce(operator.and_, list_path_qs) 
results = Path.objects.filter(final_q)[:100] 
3
from django.db.models import Q 
from operator import or_ 

# AND - use argument unpacking 
Path.objects.filter(*(Q(path__icontains=s) 
         for s in search.split())) 

# OR - use reduce 
Path.objects.filter(reduce(or_, (Q(path__icontains=s) 
           for s in search.split()))) 
+0

有沒有辦法修改這個在多個字段上搜索,就像找到標題或描述文字或其他什麼? – madprops

+0

這取決於您的具體要求,但您可能只想爲每個字段設置一個'Q'對象,並將它們與'|'運算符連接起來,就像'Q(title__i contains = s)| Q(description__i contains = s)'在生成器表達式內部。 – pyrospade