python - Django:通过评估日期是否为空来排序

标签 python django

在 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/

相关文章:

python - 子类化 numpy 标量类型

python - 根据键的唯一性从列表中删除重复的字典

python - 我如何使用python-redis检查redis数据库中是否存在值

python - 如何转换为完整的 JSON

python - django admin 不显示值

python - 查找过程如何在 python 中工作

python - 连接后如何在 Pyspark Dataframe 中选择和排序多个列

python - Django REST Framework 序列化 POST 很慢

python - Django/Apache 错误 "attempt to write a readonly database"

如果字段存在,则Django过滤查询集