返回由SearchRank排序的涉及多个表的不同对象

时间:2017-12-21 17:03:48

标签: django postgresql django-rest-framework

我有一个名为Poll的模型类,其中包含titledescriptiontags字段。我还有PollEntry班级(related_name=entries),其中还有titledescriptiontags。我正在尝试实现文本搜索(使用contrib.postgres.search)模块。显然有问题是返回按排名返回重复对象排序的搜索,Django文档基本上说"你必须小心",但没有提供任何如何处理这个问题的例子,我有过基本上没有运气在线寻找例子(在SO或其他地方)。

以下代码段似乎可以解决此问题,但我不知道这是否是最有效的方法。任何建议或参考将不胜感激!另外,请注意我在这里使用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
    )

0 个答案:

没有答案