Django 返回按涉及多个表的SearchRank排序的不同对象
我有一个名为Django 返回按涉及多个表的SearchRank排序的不同对象,django,postgresql,django-rest-framework,Django,Postgresql,Django Rest Framework,我有一个名为Poll的模型类,它有标题,描述,和标记字段。我还有一个PollEntry类(related_name=entries),它也有标题,说明,和标记。我正在尝试实现文本搜索(使用contrib.postgres.search)模块。显然,返回按排名排序的搜索时会出现问题,返回重复的对象,Django文档基本上说“你必须小心”,但没有给出如何处理此问题的任何示例,我基本上没有在网上找到示例(在某处或其他地方) 下面的代码片段似乎可以解决这个问题,但我不知道这是否是最有效的方法。如有任何建
Poll
的模型类,它有标题
,描述
,和标记
字段。我还有一个PollEntry
类(related_name=entries
),它也有标题
,说明
,和标记
。我正在尝试实现文本搜索(使用contrib.postgres.search
)模块。显然,返回按排名排序的搜索时会出现问题,返回重复的对象,Django文档基本上说“你必须小心”,但没有给出如何处理此问题的任何示例,我基本上没有在网上找到示例(在某处或其他地方)
下面的代码片段似乎可以解决这个问题,但我不知道这是否是最有效的方法。如有任何建议或参考,将不胜感激!另外,请注意,我在这里使用的是DRF
@list_route(methods=['get'])
def search(self, request):
search_query_terms = request.query_params.get('searchQuery').split(' ')
search_vector = SearchVector('entries__tags__name')+\
SearchVector('title')+\
SearchVector('description')+\
SearchVector('tags__name')+\
SearchVector('entries__title')+\
SearchVector('entries__description')
search_query = SearchQuery(search_query_terms[0])
for term in search_query_terms[1:]:
search_query = SearchQuery(term) | search_query
ids = Poll.objects\
.annotate(rank=SearchRank(search_vector, search_query))\
.order_by('-rank')\
.filter(rank__gt=0)\
.values_list('id')
polls = Poll.objects.filter(id__in=ids)
serializer = self.get_serializer(polls, many=True)
return Response(
data=serializer.data
)
很好的解决方法。但是,这不包括您的查询集
轮询中的排名,因此排名不在响应中。哦,您是对的。我应该补充一点。谢谢。除此之外,Poll.objects.filter(id\uu in=ids)
不保留顺序,因此您将按照类中定义的默认顺序对轮询对象进行排序。