2012-01-16 10 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で)。 しかし、exclude()を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)を参照してください。 –

+0

これは問題ではありません。私はdjangoコンソールで実行して実行しているので、 'Item.objects.all()。exclude(Q(tags__name__icontains = key))。distinct()' 同じ、**除外なしのすべての要素を表示する** – cmaluenda

答えて

0

私はコードを見てみると本当にあまりにもtaggitの複雑さに精通してないんだけど、...「名前は」動的に怠惰な方法で構築されているように、それはそうです。

クエリーを明示的に入力していない場合は、空のリクエストが返されるため、Q(tags__name__icontains=key)は空になり、exclude(...)はちょうどfilter(not null)となります。

select_related()などのタグクエリを強制的に入力してください。

関連する問題