Дублирование результатов при запросе с использованием SearchVector

#python #python-3.x #django #django-models #django-queryset

#python #python-3.x #django #django-модели #django-набор запросов

Вопрос:

У меня есть класс абстрактной модели с именем PostType и несколькими производными от него подмоделями. Модель выглядит следующим образом:

 
class PostType(models.Model):
    title = models.CharField(
        max_length=255,
        unique=True,
        verbose_name='Title'
    )
    description = models.CharField(
        max_length=255,
        default='',
        verbose_name='Description'
    )
    tags = models.ManyToManyField(
        to=Tag,
        blank=True,
        verbose_name='Tags'
    )
    content = RichTextUploadingField(
        default='',
        verbose_name='Post Content'
    )

    class Meta:
        abstract = True

  

Он имеет связанную модель тегов, которая выглядит следующим образом:

 
class Tag(models.Model):
    name = models.CharField(
        max_length=255,
        verbose_name='Name',
        unique=True
    )
    description = models.TextField(
        verbose_name='Description',
        default=''
    )

  

В одном из моих представлений я пытаюсь запросить все подклассы, используя SearchVector и выполняя поиск по нескольким полям:

 
query = request.GET.get('s')

from django.contrib.postgres.search import SearchVector
get_qs_list = [model.objects.annotate(
    search=SearchVector('title', 'description', 'content', 'tags__name')
).filter(search=query) for model in models.PostType.__subclasses__()]

  

Теперь поиск возвращает все результаты, которые должен. Однако по какой-то причине он возвращает повторяющиеся результаты для некоторых элементов.

Проблема, похоже, исчезнет, если я удалю 'tags__name' из SearchVector , но я не понимаю почему.

Что я делаю не так, и почему это работает, если я не выполняю поиск в соответствующем поле?

Редактировать:

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

Комментарии:

1. Вы выделили набор запросов?

2. @Blackdoor Большое вам спасибо за ваш совет! Я не знал, что мне нужно различать набор запросов при запросе связанных сообщений. Однако, похоже, это ставит передо мной другую проблему, поскольку кажется, что я должен различать по тому же полю, которое я order_by . Но, по крайней мере, теперь я могу поближе взглянуть на решение с использованием distinct! Спасибо.

3. @Azer Я знаю, что этот вопрос устарел, но, может быть, есть шанс, что вы помните, если и как вам это нравится : D? Теперь у меня такая же проблема, если я добавляю .distinct(‘id’), он говорит, что я должен различать их по тому же полю, которое я order_by .

4. @bazzuk123 У меня была такая же проблема и отсюда вывод github.com/bruvellu/cifonauta/issues/137#issuecomment-377959559 сработало для меня: SearchVector(StringAgg('relatedmodel__fieldname', delimiter=' '))