如何在ListAPIView中使用django-filter对过滤结果进行排序

时间:2018-03-01 23:29:59

标签: django django-rest-framework django-filter

我有ListAPIView使用DjangoFilterBackend根据网址参数过滤房间。下面的代码就可以了。

现在,我想根据从Room对象的其他属性计算的分数,另一个url参数以及我们对发出请求的用户的了解来对结果进行排序。功能本身并不重要。

如何在应用我已有的过滤器后对结果进行排序?

如果我自己进行过滤,我想我可以进行过滤,计算分数并在get_queryset中对结果进行排序,但我不知道如何在使用{{1 }}

示例查询

例如,我会执行此查询以按低于100的价格进行过滤。django-filter值将用于计算排序分数:

other_field

代码

http://localhost:8000/api/search/rooms?price=100&other_field=200

1 个答案:

答案 0 :(得分:4)

尝试覆盖API中的list(),如下所示,

class RoomSearchView(generics.ListAPIView):
    queryset = Room.objects.all()
    serializer_class = RoomSearchSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_class = RoomFilter

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        queryset = queryset.order_by('-id')  # change is here  >> sorted with reverse order of 'id'

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)