gpt4 book ai didi

python - 我如何测试 Django QuerySets 按 PK 升序排序

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:43 25 4
gpt4 key购买 nike

class Foo(models.Model):
name = models.CharField(max_length=10)

class Meta(object):
ordering = ('pk', )

我想测试这个顺序是否按我预期的那样工作。

def test_respect_ordering(self):
Foo.objects.create(name="bar", pk=2)
Foo.objects.create(name="baz", pk=1)
results = Foo.objects.all()
self.assertEqual("baz", results[0].name)
self.assertEqual("bar", results[1].name)

虽然这按我预期的那样工作,但无论 Meta 类或其中定义的排序属性如何,我的测试都通过了。有什么方法可以测试这段代码是否重要?

我为什么要测试这个? 我的测试在 SQLite 中运行,但生产是在 mysql 中。希望有一天,我们会使用更好的 RDMBS,也许 PK 不会返回所有这些 RDMBS 的结果。

Django docs表示排序不会自动发生。

最佳答案

如果您在 Meta 类中省略了 ordering 属性,生成的 SQL 查询将不会有 ORDER BY 子句(好吧,无论如何在 1.4 中)。这意味着您不能依赖行的顺序。

无序的 SQL 查询通常会有一个看起来有意义的顺序。这是因为查询计划很可能会使用索引来减少查询时间,而索引可以在无序查询的行顺序中发挥重要作用。除非另有说明,否则由 Django 模型生成的表将仅在主键上有索引,因此通常“无序”顺序与按主键排序时的顺序非常相似。

但是,这里绝对不能保证,这个顺序不能靠。查询计划在很大程度上取决于数据库引擎,对于同一引擎上非常相似的查询,它甚至可能会发生巨大变化。

如果你想要一个特定的顺序,你应该明确指定你想要的顺序。这是保证特定订单的唯一可靠方式。

关于python - 我如何测试 Django QuerySets 按 PK 升序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23374036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com