gpt4 book ai didi

python - 可空列的 Django REST ViewSet 排序

转载 作者:行者123 更新时间:2023-11-28 21:37:44 27 4
gpt4 key购买 nike

考虑一个表 Person:

| 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) 但是弄乱了详细 View ,并给出了 get() 返回的多个值 错误.


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

最佳答案

来自 changelog django 1.11

Added the nulls_first and nulls_last parameters to Expression.asc() and desc() to control the ordering of null values.


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

from django.db.models import F

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

关于python - 可空列的 Django REST ViewSet 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49056619/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com