Django测试中的主键

时间:2015-03-15 20:07:01

标签: python django

现在我为我的第一个django应用程序编写测试并且遇到了主键的问题,看起来像测试pk并不是自动递增。

我为测试设置了所有数据,如下所示:

Work(title="Test title").save()
Work(title="Test title").save()
Work(title="Test title").save()

得到这样的行:

work = Work.objects.get(pk=1)
work2 = Work.objects.get(pk=2)
work3 = Work.objects.get(pk=3)

但我试图获得的主键与我预先创建的数据不匹配,如果对于数据我也设置了pk,那么一切正常,我的意思是Work(pk=1, ...)

我只是想知道它为什么会这样,为什么我不能使用自动递增值?

1 个答案:

答案 0 :(得分:1)

所以这有点依赖于Django的几个方面。他们使用的默认测试类实际上将在事务中运行每个测试(https://docs.djangoproject.com/en/1.7/topics/testing/tools/#django.test.TestCase)。这会导致主键在类之间继续递增。

还有一种观点认为,依靠类中的PK会导致错误的假设...所以你有一些选择

  1. 不要依赖主键值(良好做法)
  2. 在创建对象后保存主键并使用
  3. 使用不对测试执行此操作的其他测试用例实现。考虑(TransactionTestCase),它会在测试之间截断,并导致更多预期的行为(尽管可能不会那么快......但我真的无法区分真正的差异)