Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 返回按涉及多个表的SearchRank排序的不同对象_Django_Postgresql_Django Rest Framework - Fatal编程技术网

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)
不保留顺序,因此您将按照类中定义的默认顺序对轮询对象进行排序。