django - 如何使用 Django ORM 按值的存在或 null 进行排序

标签 django django-orm

我想按两列对表格进行排序。对于第一列,我想按值或 NULL 的存在进行排序。

无效代码来说明我想要做什么:

MyModel.objects.order_by('blop IS NULL', 'name')

我尝试使用注释,但没有找到定义表达式来设置字段的方法,或定义聚合函数来从字段返回 bool 值的方法。

无法运行的代码来说明我的尝试:

MyModel.objects.annotate(has_blop=F('blop IS NULL')).order_by('has_blop', 'name')

我认为我可以使用条件注释(Case...When...)来管理,但这似乎有点过分了。

使用的数据库是postgres。

最佳答案

您可以按条件Q(blop=None)进行排序。然而,它需要 ExpressionWrapper [Django-doc]将条件转换为 bool 字段:

from django.db.models import BooleanField, ExpressionWrapper, Q

MyModel.objects.order_by(
    ExpressionWrapper(<b>Q(blop=None)</b>, BooleanField()).asc(),
    'name'
)

关于django - 如何使用 Django ORM 按值的存在或 null 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62570981/

相关文章:

python - Django:根据相关集注释值

python - 如何在每个月底运行 Celery 定期任务

python - Google App Engine 上的 Django 和 GeoSpatial 查询 - 如何克服 'one inequality per query' 问题?

Django 迁移 RunSQL 以数据库类型为条件

mysql - Django - SQLite 与 MySQL 上的 DateTimeField 查询

python - Django ORM,按天分组

python - 如何在 Django View 中获取 POST 请求值?

Django 1.8.5 allauth 和项目应用程序名称冲突

python - CheckConstraint 的 Q 对象

python - 如何注释多个 Django 模型