поиск django не работает с более чем 2 полями - PullRequest
0 голосов
/ 12 июня 2018

У меня есть приложение для блога, использующее django со следующими моделями

class Category(models.Model):

    id=models.AutoField(primary_key=True)
    title=models.CharField(unique=True,max_length=30,null=False,blank=False)

class Article(models.Model):

    id=models.AutoField(primary_key=True)
    title=models.CharField(max_length=100,null=False,blank=False)
    category=models.ForeignKey(Category,null=False,blank=False)
    summary=models.CharField(null=False,blank=False,max_length=400)
    content = models.TextField(null=False, blank=False)

class Comment(models.Model):

    id=models.AutoField(primary_key=True)
    article=models.ForeignKey(Article,null=False,blank=False)
    visitor_name=models.CharField(max_length=50,null=False,blank=False)
    content=models.TextField(null=False,blank=False)

В области администратора я пытаюсь реализовать поисковую систему, которая позволит администратору искать комментарии по нескольким полям.

Я использую следующий код:

all_queries = None
keywords=''
search_fields = ('visitor_name','content','article__title','article__resume','article__category__title','article__content')
for keyword in keywords.split(' '):
    keyword_query = None
        for field in search_fields:
            each_query = Q(**{field + '__icontains': keyword})
            if not keyword_query:
                keyword_query = each_query
            else:
                keyword_query = keyword_query | each_query
                if not all_queries:
                    all_queries = keyword_query
                else:
                    all_queries = all_queries & keyword_query

comments = Comment.objects.filter(all_queries).distinct().order_by('-date')

У меня проблема с этой строкой:

search_fields = ('visitor_name','content','article__title','article__resume','article__category__title','article__content')

Каким-то образом я получаю пустой набор запросов, потому что я 'm поиск в 6 полях, так как я могу искать только в 2.

Например, эта строка:

search_fields = ('visitor_name','content')

работает очень хорошо, потому что в ней есть ровно два поля для поиска.

Если я добавлю только одно поле в массив, оно не будет работать

1 Ответ

0 голосов
/ 13 июня 2018

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

Уменьшить уровень отступа для кода, который создает all_queries:

all_queries = None
keywords=''
search_fields = ('visitor_name','content','article__title','article__resume','article__category__title','article__content')
for keyword in keywords.split(' '):
    keyword_query = None
    for field in search_fields:
        each_query = Q(**{field + '__icontains': keyword})
        if not keyword_query:
            keyword_query = each_query
        else:
            keyword_query = keyword_query | each_query

    # You only want to do this for each keyword
    if not all_queries:
        all_queries = keyword_query
    else:
        all_queries = all_queries & keyword_query

comments = Comment.objects.filter(all_queries).distinct().order_by('-date')
...