在 Django 中,是否可以根据字段是否为 None 来排序,而不是字段本身的值?
我知道我可以将查询集发送到 python sorted()
但我想将其保留为查询集以供后续过滤。因此,我更愿意在 QuerySet 本身中进行排序。
例如,我有一个终止日期字段,我想首先对没有终止日期的字段进行排序,然后我想按不同的字段排序,例如姓氏、名字。
这可能吗,还是我一直在使用 sorted()
,然后必须使用包含的 id 执行一个全新的查询,并在新的 QuerySet 上运行 sorted()
?我可以做到这一点,但不想浪费开销并利用查询集的优点,即它们在评估之前不会运行。
翻译,假设我的应用程序是 employee
,我的模型是 Employee
并且它具有三个字段“first_name (varchar)”、“,我如何从 Django 获取此 SQL “last_name (varchar)”和“termination_date (date)”:
SELECT
"employee_employee"."last_name",
"employee_employee"."first_name",
"employee_employee"."termination_date"
FROM "employee_employee"
ORDER BY
"employee_employee"."termination_date" IS NOT NULL,
"employee_employee"."last_name",
"employee_employee"."first_name"
最佳答案
您应该可以通过query expressions订购,像这样:
from django.db.models import IntegerField, Case, Value, When
MyModel.objects.all().order_by(
Case(
When(some_field=None, then=Value(1)),
default=Value(0),
output_field=IntegerField(),
).asc(),
'some_other_field'
)
我无法在这里进行测试,因此可能需要一些修改,但这应该将具有 NULL some_field
的行放在具有 some_field
的行之后。每组行应按 some_other_field
排序。
当然,CASE/WHEN 比你在问题中提出的要麻烦一些,但我不知道如何让 Django ORM 输出它。也许其他人会有更好的答案。
关于python - Django:通过评估日期是否为空来排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37398585/