Django taggit doesn't work exclude

473 Views Asked by At

I am using Django-taggit and works fine for me but the exclude has a problem. Keyword is a string like 'key1 key2 key3'. The code is:

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)))

It works fine for filter() and for the exclude() Q(name_icontains=x), Q(author_name_icontains=x). But, when I try to use exclude() with Q(tags_name__icontains=x) it doesnt work.

Regards, Cristian

2

There are 2 best solutions below

0
On

I'm not really too versed in taggit intricacies, but... Looking at the code, it seems like the "name" is dynamically built in a lazy way.

So, if you're not populating the query explicitly, you're going to get empty request, so Q(tags__name__icontains=key) will be empty, and exclude(...) will just be like filter(not null).

Try to force populating the tag query via a select_related() or something similar.

0
On

I think, It is not supported. I found this link: https://github.com/alex/django-taggit/issues/31