禁用Django查询的默认排序



Django根据主键对结果进行默认排序。在我的应用程序中,我需要相反的顺序,即最新的记录总是应该在第一位。我看过这个问题的答案,建议使用order_by()query.order_by()。我遇到的问题是,由于某些原因,我应该使用原始SQL查询,它们会产生:

'RawQuery' object has no attribute 'order_by'

或:

'RawQuery' object has no attribute 'clear_ordering'

根据评论和这篇文章,我在datetime字段上创建了一个索引,如下所示:

class Meta:
indexes = [
models.Index(fields=['-created_at']),
]

但实际上这对我没有帮助。

我遇到的问题是,由于某些原因,我应该使用原始SQL查询。

一旦使用了原始查询,就不能再使用Django的ORM方法了。原始查询意味着您指定了查询,因此Django不了解查询是如何工作的,因此无法更改排序。

因此,您应该在原始查询本身中进行排序。类似于:

MyModel.objects.raw(
'SELECT app_name_table.id FROM app_name_tableORDER BY id DESC'
)

但Django ORM不能帮助以有效的方式构建查询的情况非常罕见。因此,通常应将原始查询作为最后手段。

最新更新