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
来获得所需的行为?
来自changelog的django 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的区别