选择相关字段后的重复值

问题描述 投票:0回答:1

我有一个简单的论坛应用程序:


# 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>, ...]>

我认为这是因为一个主题中的多个消息为我提供了不同的排名值。

如何删除重复的主题,但保持排名顺序?

python django full-text-search
1个回答
0
投票

您需要做的就是将.distinct()添加到查询集的末尾。

您应该查看the documentation,其中有一些有关结合使用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()
© www.soinside.com 2019 - 2024. All rights reserved.