Как да комбинирате множество набори от заявки и да премахнете дубликати?

Използвам Django 1.6.1 с django-taggit.

Опитвам се да разширя търсачката си, така че да търси ключови думи в други полета освен полетата за тагове. Проблемът е, че когато итерирам през етикетите за icontains търсене в името на модела, наборът от заявки изглежда престава да бъде набор от заявки, губейки метода си за отчитане и отделният метод не работи.

views.py:

def index(request):
    numresources = Resource.objects.count()

    if request.method == 'POST':
        form = SearchForm(request.POST)
        if form.is_valid():
            query = form.cleaned_data['query']
            tags = parse_tags(query.lower())

#            resourcelist = []
#            for tag in tags:
#                resourcelist.extend(Resource.objects.filter(name__icontains=tag).filter(isActive=True).order_by('-score').distinct())
#            resourcelist.extend(Resource.objects.filter(tags__name__in=tags).filter(isActive=True).order_by('-score').distinct())
#            numresults = len(resourcelist)

            resourcelist = Resource.objects.filter(tags__name__in=tags).filter(isActive=True).order_by('-score').distinct()
            querymade = True
            numresults = resourcelist.count()
        else:
            resourcelist = Resource.objects.filter(isActive=True).order_by('-created')[:100]
    else:
        resourcelist = Resource.objects.filter(isActive=True).order_by('-created')[:100]
        form = SearchForm()

    return render(request, 'index.html', locals())

Изглежда тромаво да трябва да добавите ключовата дума „django“ към запис, който има „django“ в заглавието или URL адреса. Искам да имам не само резултатите, чиито тагове съответстват на ключовите думи, въведени от потребителя, но искам да търся в други полета за въведените ключови думи, да комбинирам тези набори от заявки и да оставя всеки резултат, добавен два пъти или повече.

И така, как и кога в този процес да сортирам по резултат и след това да премахна дубликати?


person pyrodney    schedule 09.01.2014    source източник


Отговори (1)


Мисля, че искате нещо подобно:

from django.db.models import Q

Resource.objects.filter(Q(name__icontains=tag) | Q(tags__name__in=tags)).filter(isActive=True).order_by('-score').distinct()

Документация за Q обекти

person Goin    schedule 09.01.2014