2014-01-09 5 views
3

Я использую 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()) 

кажется неуклюжим, чтобы добавить «Джанго» ключевое слово для записи, имеющей «Джанго» в названии или URL. Я хочу иметь не только результаты, теги которых соответствуют введенным вами ключевым словам, но я хочу искать другие поля для введенных ключевых слов, объединять эти запросы и оставлять любые добавленные два или более результата.

Так как и когда в этом процессе я сортирую по счету, а затем удаляю дубликаты?

ответ

6

Я думаю, что вы хотите что-то вроде этого:

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 objects documentation

Смежные вопросы