Django REST ViewSet为Null-able列排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django REST ViewSet为Null-able列排序相关的知识,希望对你有一定的参考价值。

考虑一个表人:

| name | wealth |
|------| ------ |
|Abby  | 12     |
|Ben   | Null   |
|Carl  | 5      |
|Diane | Null   |

我们想按财富排序,降序,即获得(Abby, Carl, Ben, Diane),但Django的order_by函数首先按Null排序:

class PersonViewSet(serializers.ModelViewSet):
        serializer_class = PersonSerializer
        queryset = Person.objects.all().order_by('-wealth)

(Ben, Diane, Abby, Carl),即它首先列出Null值然后按财富排序。


我尝试重新定义get_queryset方法:

class PersonViewSet(serializers.ModelViewSet):
    serializer_class = PersonSerializer

    def get_queryset():
        invalid_entries = Person.objects.filter(wealth=None)
        valid_entries = Person.objects.all().difference(invalid_entries).order_by('-wealth')
        return valid_entries.union(invalid_entries)

这确实返回了所需的行为,(Abby, Carl, Ben, Diane)但是弄乱了详细视图,并给出了get() returned multiple values错误。


有没有办法通过自定义排序功能或仅为列表视图修改get_queryset来获得所需的行为?

答案

来自changelogdjango 1.11

在Expression.asc()和desc()中添加了nulls_first和nulls_last参数,以控制空值的排序。

所以,如果你正在使用django>=1.11,你可以使用Expression.desc()方法对字段进行排序,如下所示,

from django.db.models import F

queryset = Person.objects.all().order_by(F('wealth').desc(nulls_last=True))

以上是关于Django REST ViewSet为Null-able列排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django rest 框架中反转 ViewSet 自定义操作的 URL

ViewSet方法的Django rest框架permission_classes

Django Rest Framework:在 ViewSet 上打开分页(如 ModelViewSet 分页)

Django rest框架中ViewSet和GenericViewSet的区别

Django Rest Framework:在 ViewSet 中注册多个序列化程序

Django Rest Framework ViewSet 出现 404 错误