如果在Django模型Meta中未指定订购会发生什么

时间:2018-09-30 18:13:01

标签: python django django-models

如果未指定模型的内部ordering类中的Meta字段,生成的SQL查询是否返回结果,结果是否位于随机位置?

如果为true,则分页(偏移量切片)将在下一页返回重复项,对吗?

2 个答案:

答案 0 :(得分:2)

这不是随机的,但是Django不会在您的查询中添加order by。 您可以通过运行以下命令来查看它:

print(str(YourModel.objects.all()[:2].query))

您可以查看此答案https://stackoverflow.com/a/20050403/4175590,以查看在这种情况下数据库的工作方式。

答案 1 :(得分:2)

  

如果未指定模型的内部Meta类中的排序字段,则生成的SQL查询是否返回结果,结果是否位于随机位置?

如果您未指定顺序(也不通过Meta或在查询集中的.order_by子句中指定顺序),则Django将构建类似以下的查询:

SELECT model.*
FROM model

(可能带有其他子句,但不带有ORDER BY语句)。

这意味着数据库可以自由以任何顺序返回记录。这不是说 意味着数据库将“洗牌”记录,但是您根本无法确定将以什么顺序检索记录。

某些数据库将以(反向)“编辑时间戳”顺序返回记录,因此,最新添加/编辑的记录优先。但这不是 您应该依赖的东西(您可以将其视为实现细节)。

此外,如果涉及JOIN,它也可以依赖于查询本身,因为这样,由于JOIN的处理过程,该表可以得到排序。

但是,通常的想法是,它可以按任何顺序返回记录,并且对表的更改可能导致顺序更改。

这对分页有一些影响,因为如果用户移至下一页,同时顺序发生变化,则当用户获取下一页时,查询集本身将不会具有相同的顺序。因此,您最好对查询集排序(以一种或另一种方式)。例如,按ID。