如果未指定模型的内部ordering
类中的Meta
字段,生成的SQL查询是否返回结果,结果是否位于随机位置?
如果为true,则分页(偏移量切片)将在下一页返回重复项,对吗?
答案 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。