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

标签 django null django-rest-framework

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

相关文章:

Django DRF - 添加 subview /url?

python - 在 Heroku 中找不到满足 tensorflow==1.0.0 要求的版本

python - 高效的 Django 查询

python - PyCharm 在 2016.1.2 中不再自动完成 Django 模型查询

c# - 使用空合并运算符的独特方式

c - 通过将指针设置为 NULL 来初始化 C 中的堆栈

python - 无法导入 : 'unable to import rest_framework' when importing serializer?(Windows)

ios - Swift Json 值不断上升为 "nil"

python - 在 Django REST ListAPI View 中对原始 SQL 查询进行分页的最佳方法?

python - Django Rest 框架 - 外键上的 NOT NULL 约束