gpt4 book ai didi

django - 使用 Django Rest Framework 按降序忽略空值

转载 作者:行者123 更新时间:2023-12-02 06:43:26 24 4
gpt4 key购买 nike

我的网站使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com