Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 可空列的Django REST视图集排序_Python_Django_Serialization_Django Rest Framework_Django Rest Viewsets - Fatal编程技术网

Python 可空列的Django REST视图集排序

Python 可空列的Django REST视图集排序,python,django,serialization,django-rest-framework,django-rest-viewsets,Python,Django,Serialization,Django Rest Framework,Django Rest Viewsets,以一个餐桌上的人为例: | name | wealth | |------| ------ | |Abby | 12 | |Ben | Null | |Carl | 5 | |Diane | Null | 我们希望按财富降序对行进行排序,即获取(Abby,Carl,Ben,Diane),但Django的order_by函数首先按Null对行进行排序: class PersonViewSet(serializers.ModelViewSet):

以一个餐桌上的人为例:

| 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)
,即首先列出空值,然后按财富排序


我尝试重新定义
get\u 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()返回的多个值
错误


是否有一种方法可以通过自定义排序功能或仅修改列表视图的
get\u queryset
来获得所需的行为?

来自
django 1.11

将nulls_first和nulls_last参数添加到Expression.asc()中 和desc()来控制空值的顺序


因此,如果您使用的是
django>=1.11
,则可以使用
Expression.desc()
方法对字段进行如下排序,

from django.db.models import F

queryset = Person.objects.all().order_by(F('wealth').desc(nulls_last=True))
除了回答。 还可以在视图类内定义属性:

class PersonViewSet(serializers.ModelViewSet):
    serializer_class = PersonSerializer
    ordering = [F('wealth').desc(nulls_last=True)]


在Postgres SQL中,您需要类似的东西,这可以表示为
ORDER BY wealth DESC NULLS LAST
perfect,这就是我需要的:)