2012-01-16 33 views
0

我使用的是Django-taggit,對我來說工作正常,但排除有問題。 關鍵字是類似'key1 key2 key3'的字符串。該代碼是:Django taggit不工作排除

keyword = form.cleaned_data['keyword'] 
qlist = lambda x: [Q(name__icontains=x), Q(author__name__icontains=x),Q(tags__name__icontains=x)] 
item_list = Item.objects.distinct() 
for key in keyword.split(): 
    if ('-'==key[0]): 
     print 'exclude: %s'%(key[1:]) 
     item_list = item_list.exclude(reduce(operator.or_,qlist(key[1:]))) 
    else: 
     print 'include: %s'%(key) 
     item_list = item_list.filter(reduce(operator.or_,qlist(key))) 

它工作正常的過濾器()併爲排除() Q(名_ icontains = X),Q(作者 _name_ icontains = X)。 但是,當我嘗試使用排除()與Q(標籤 _name__icontains = x)它不起作用。

問候, 克里斯蒂安

+0

也許operator.or_有問題。有關詳細信息,請參閱[此處](http://stackoverflow.com/questions/8138919/trying-to-reduce-django-q-objects-with-operator-or-seems-to-result-in-reduction)。 – 2012-01-16 15:46:45

+0

這不是問題(我猜),因爲我在django控制檯中運行並執行: 'Item.objects.all()。exclude(Q(tags__name__icontains = key))。distinct()' 而且它執行同樣,顯示所有元素沒有**排除** – cmaluenda 2012-01-16 16:38:52

回答

0

我真的不太複雜taggit精通,但...查看代碼,它似乎是「名」是動態建立在一個偷懶的辦法。

所以,如果你沒有明確填充查詢,你會得到空請求,所以Q(tags__name__icontains=key)將是空的,exclude(...)將只是像filter(not null)

試圖強制通過select_related()或類似的東西填充標籤查詢。