Django REST ViewSet为Null-able列排序

问题描述 投票:0回答:1

考虑一个表人:

| 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来获得所需的行为?

python django serialization django-rest-framework django-rest-viewsets
1个回答
3
投票

来自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))
© www.soinside.com 2019 - 2024. All rights reserved.