如何在Django ORM中更改PostgreSQL的默认空排序行为

如何在Django ORM中更改PostgreSQL的默认空排序行为,django,postgresql,orm,Django,Postgresql,Orm,默认情况下,PostgreSQL会将空值视为最高值,因此会首先对降序查询进行排序,然后对升序查询进行排序 通过指定“NULLS LAST”或“NULLS FIRST”,可以在每个查询或索引创建时修改此行为 如何将其与Django ORM结合使用,而不需要使用原始查询? 例如,当我向查询集添加类似于“-publish\u start”的qs.order\u by”之类的内容时,如何指定空值的排序?或者,作为一种替代方法,在字段/索引声明时。我找到了一种方法,通过使用extra,使空检查成为布尔值,

默认情况下,PostgreSQL会将空值视为最高值,因此会首先对降序查询进行排序,然后对升序查询进行排序

通过指定“NULLS LAST”或“NULLS FIRST”,可以在每个查询或索引创建时修改此行为

如何将其与Django ORM结合使用,而不需要使用原始查询?
例如,当我向查询集添加类似于“-publish\u start”的
qs.order\u by”之类的内容时,如何指定空值的排序?或者,作为一种替代方法,在字段/索引声明时。

我找到了一种方法,通过使用
extra
,使空检查成为布尔值,并在对布尔值进行排序时
false
似乎是通用的,以适应任何一种工作方式(null作为最高值或最低值)的DB引擎:

qs = qs.extra(select={'null_start': "publish_start is null"},
              order_by=['null_start', '-publish_start'])

值得一提的是(因为我很慢,我花了一段时间才弄明白),如果你想让结果先为空值,然后
publish\u start
按升序排列,你需要按语句颠倒顺序:
['-NULL\u start',publish\u start']
@blueyed是的,这就是堆栈溢出中4年前的答案。它们变得过时了。没必要投反对票。。。