如何在ListAPIView中使用django-filter对过滤结果进行排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在ListAPIView中使用django-filter对过滤结果进行排序相关的知识,希望对你有一定的参考价值。
我有一个ListAPIView
使用DjangoFilterBackend
根据url参数过滤房间。下面的代码就可以了。
现在,我想根据从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
答案
尝试在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)
以上是关于如何在ListAPIView中使用django-filter对过滤结果进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何将两个不同的ListAPIView转换为单个ModelViewSet
django drf GenericAPIView和ListAPIView
(生鲜项目)08. ModelSerializer 实现商品列表页, 使用Mixin来实现返回, 以及更加方便的ListAPIView, 以及分页的设置