【发布时间】:2014-06-15 22:39:51
【问题描述】:
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 类或其中定义的 ordering 属性如何,我的测试都通过了。有什么方法可以测试这段代码是否重要?
我为什么要测试这个? 我的测试在 SQLite 中运行,但生产在 mysql 中。希望有一天,我们会使用更好的 RDMBS,并且可能不会通过所有这些 RDMBS 的 PK 返回结果。
Django docs 表示排序不会自动发生。
【问题讨论】:
-
如果你设置
ordering = ('name', ),你的测试应该会失败,不是吗? -
那会失败,但从 Meta 中删除它不会失败,这就是我想要证明的......
-
从 Meta 中删除它意味着您的数据库将默认按 pk 排序,所以我并不惊讶它通过了...
-
我喜欢这种做法stackoverflow.com/a/51939953/1649917 - 检查类的元组件是否包含您期望的顺序
-
还有queryset.ordered:docs.djangoproject.com/en/3.1/ref/models/querysets/…