从Django过滤器调用返回的列表的默认顺序是什么?

Ada*_*wis 47 python django postgresql sql-order-by django-orm

简短问题
当连接到PostgreSQL数据库时,从Django过滤器调用返回的列表的默认顺序是什么?

背景
通过我自己也承认,我提出在应用一个糟糕的假设层,在其返回一个列表中的顺序将是常数,即不使用"ORDER_BY".我查询的项目列表不是按字母顺序或任何其他故意的顺序.它被认为保持与添加到数据库中的顺序相同.

这个假设适用于数百个查询,但是当订单在不知不觉中发生变化时,我的应用程序报告了失败.据我所知,在这段时间内没有触及这些记录,因为我是维护数据库的唯一人.令人困惑的是,当在Mac OS X上运行Django应用程序时,它仍然按预期工作,但在Win XP上,它改变了顺序.(请注意,上面提到的数百个查询都在Win XP上).

任何对此的见解都会有所帮助,因为我在Django或PostgreSQL文档中找不到解释操作系统差异的任何内容.

示例呼叫

required_tests = Card_Test.objects.using(get_database()).filter(name__icontains=key)
Run Code Online (Sandbox Code Playgroud)

编辑
今天与我的一些同事交谈后,我得到了与BjörnLindqvist相同的答案.

回想起来,我明白为什么这样做经常出错.使用ORM Django,sqlalchemy或其他任何一个好处是您可以编写命令而无需了解或理解(详细)它所连接的数据库.不可否认,我碰巧是其中一个用户.然而,另一方面,在不知道数据库的情况下,这样的调试错误非常麻烦并且可能是灾难性的.

Bjö*_*ist 76

否默认顺序,不能强调不够,因为每个人都没有错点.

数据库中的表不是普通的html表,它是一组无序的元组.程序员通常只会使用MySQL,因为在特定的数据库中,行的顺序通常是可预测的,因为它没有利用某些高级优化技术.例如,无法知道将在以下任何查询中返回哪些行或其顺序:

select * from table limit 10
select * from table limit 10 offset 10
select * from table order by x limit 10
Run Code Online (Sandbox Code Playgroud)

在上一个查询中,只有当列x中的所有值都是唯一的时,才能预测该顺序.只要满足select语句的条件,RDBMS就可以按任意顺序返回任何行.

虽然您可以在Django级别添加默认顺序,这会导致它为每个非有序查询添加order by子句:

class Table(models.Model):
    ...
    class Meta:
        ordering = ['name']
Run Code Online (Sandbox Code Playgroud)

请注意,如果由于某种原因您不需要有序行,则可能会降低性能.

  • [Django docs](https://docs.djangoproject.com/zh-CN/2.0/ref/models/options/#ordering):“如果查询未指定顺序,则从数据库中返回未指定的结果仅当通过一组唯一标识结果中每个对象的字段进行排序时,才能保证特定的排序。例如,如果名称字段不是唯一的,则按其排序不能保证始终显示相同名称的对象以相同的顺序。” (2认同)