我的网站使用 Django,因此决定使用 Django Rest Framework 来构建我的 REST API。对于特定模型,我想过滤文本字段(使用 SearchFilter ),过滤一些分类字段(定义了 FilterSet 的 FilterBackend )并能够根据某些字段对数据进行排序(为此使用 OrderingFilter )。
class StatsAPI(generics.ListAPIView):
model = Stats
queryset = Stats.objects.all()
serializer_class = StatsSerializer
filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter, filters.SearchFilter)
filter_class = StatsFilter
pagination_class = StatsPagination
ordering_fields = ('__all__')
search_fields = ('display_name')
我面临的问题是我的排序字段,因为它们也包含空值。按升序排序效果很好。但是,按降序排序 (www.example.com/api/stats/?ordering=-appearance) 会将空值推到顶部。
使用降序排列时如何忽略空值?可以进行排序的字段数量大约为20个。
最佳答案
这是一个稍微不同的解决方案 - 不是过滤空值,而是过滤器的替换。OrderingFilter 只是始终确保它们最后排序:
class NullsAlwaysLastOrderingFilter(filters.OrderingFilter):
""" Use Django 1.11 nulls_last feature to force nulls to bottom in all orderings. """
def filter_queryset(self, request, queryset, view):
ordering = self.get_ordering(request, queryset, view)
if ordering:
f_ordering = []
for o in ordering:
if not o:
continue
if o[0] == '-':
f_ordering.append(F(o[1:]).desc(nulls_last=True))
else:
f_ordering.append(F(o).asc(nulls_last=True))
return queryset.order_by(*f_ordering)
return queryset
关于django - 使用 Django Rest Framework 按降序忽略空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42899552/