我对Django查询集排序有问题.

我的模型包含一个名为position(A PositiveSmallIntegerField)的字段,我想用它来对查询结果进行排序.

我用的是order_by('position'),效果很好.

Problem:我的position字段可以为空(null=True, blank=True),因为我不想为模型的每50000个实例指定一个位置:(

当一些实例的"position"为空时,order_by将它们返回到列表的顶部:我希望它们位于列表的末尾……

在原始SQL中,我过go 常常编写类似"IF(position IS NULL or position='', 1, 0)"(参见http://www.shawnolson.net/a/730/mysql-sort-order-with-null.html)的内容:使用Django是否可以在不编写原始SQL的情况下获得相同的结果?

非常感谢!

推荐答案

您可以使用django agrregation中的Annotate()来完成此操作:

items = Item.objects.all().annotate(null_position=Count('position')).order_by('-null_position', 'position')

Django相关问答推荐

Django动态页面.为什么我的代码不工作?

AttributeError:';ManyToOneRel&39;对象没有属性';attname';

Django OneToOneFieldto抽象对象

测试 - 两个类共享相同的登录代码,但它只能在一个类中工作

Django ImproperlyConfigured: AUTH_USER_MODEL指向尚未安装的模型'users.User'

将两个视图重定向到具有不同 url id Django 的一个模板的正确方法

DecimalField 验证错误,返回不正确的值 Django

- 不支持的操作数类型:DateField和DateField

是否可以在 Django 中重命名应用程序的组名?

Django 模板中的 Handlebars.js

如何访问 Django Rest Framework 上的自定义 HTTP 请求标头?

为什么 django 1.7 会为字段 Select 的变化创建迁移?

Django 1.9:字段与父模型中不存在的字段的字段冲突

Django error:不能分配必须是实例

在 Django 中提供大文件(高负载)

模型 Django 中的 ID 字段

virtualenv(python3.4), pip install mysqlclient 错误

Django中GROUP BY中注释的聚合

Django Debug Toolbar:了解时间面板( time panel)

Django REST 框架中的每个字段权限