Как объединить несколько наборов запросов и удалить дубликаты?

Я использую Django 1.6.1 с django-taggit.

Я пытаюсь расширить свою поисковую систему так, чтобы она выполняла поиск по ключевым словам в других полях, помимо полей тегов. Проблема в том, что когда я перебираю теги для поиска значков в имени модели, кажется, что набор запросов перестает быть набором запросов, теряет свой метод подсчета, и отдельный метод не работает.

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