【问题标题】:Duplicated values after select related field选择相关字段后重复值
【发布时间】:2020-02-01 05:38:45
【问题描述】:

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


# 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】:

    您需要做的就是将.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()
    

    【讨论】:

    • 我遇到了类似的问题,即使添加 distinct() 也没有解决问题。它仍然返回多个相同的对象。你能帮帮我吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    相关资源
    最近更新 更多