Дублированные значения после выбора соответствующего поля - PullRequest
0 голосов
/ 03 октября 2019

У меня есть простое приложение на форуме:


# models
class Topic(models.Model):
    title = models.CharField(max_length=255)

class Message(models.Model):
    text = models.TextField()
    topic = models.ForeignKey(Topic, related_name='messages')

# views
class SearchView(ListView):
    ...

    def get_queryset(self):
        search_vector = SearchVector('messages__text')
        search_query = SearchQuery(self.request.GET.get('query'))
        topics = Topic.objects.annotate(
            rank=SearchRank(search_vector, search_query)
        ).filter(rank__gte=0.0).order_by('-rank')
        return topics

Я хочу иметь полнотекстовый поиск на моем форуме. Все работает, но в результатах запроса к теме я получил дублированные объекты.

<QuerySet [<Topic: 1>, <Topic 1>, <Topic 2>, <Topic 1>, ...]>

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

Как я могу удалитьповторяющиеся темы, но сохраняйте порядок рангов?

1 Ответ

0 голосов
/ 03 октября 2019

Все, что вам нужно сделать, это добавить .distinct() в конец вашего набора запросов.

Вы должны просмотреть документацию , в которой есть некоторые конкретные замечания по использованию distinct() вв сочетании с order_by(). Здесь это не должно повлиять на вас, так как вы упорядочиваете не по полю соответствующей модели, а что-то, на что нужно обратить внимание.

class SearchView(ListView):
    ...

    def get_queryset(self):
        search_vector = SearchVector('messages__text')
        search_query = SearchQuery(self.request.GET.get('query'))
        topics = Topic.objects.annotate(
            rank=SearchRank(search_vector, search_query)
        ).filter(rank__gte=0.0).order_by('-rank')

        return topics.distinct()
...