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

nbe*_*hat 3 django django-filter django-rest-framework

我有一个ListAPIView使用DjangoFilterBackend来根据网址参数过滤房间。下面的代码可以做到这一点。

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

应用已有的过滤器后,如何对结果排序?

如果我要自己进行过滤,我想我可以进行过滤,计算分数并在中对结果进行排序,get_queryset但是我不知道如何使用进行过滤django-filter。

查询示例

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

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

码

class RoomFilter(filters.FilterSet):
    price = filters.NumberFilter(name="price", lookup_expr='lte')
    features = filters.ModelMultipleChoiceFilter(
        name="features", 
        conjoined=True,
        queryset=Features.objects.all()
        )

    class Meta:
        model = Room
        fields = ['price', 'features']

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

JPG*_*JPG 5

尝试list()如下重写您的API,

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)
Run Code Online (Sandbox Code Playgroud)