我有一个简单的论坛应用程序:
# 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>, ...]>
我认为这是因为一个主题中的多个消息为我提供了不同的排名值。
如何删除重复的主题,但保持排名顺序?
您需要做的就是将.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()