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,这就是我需要的:)