#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=' '))