django模型测试中的TransactionManagementError

时间:2014-07-14 03:52:07

标签: django-models django-testing django-1.6

在django 1.6中,我尝试测试一个独特的领域。

# model tag
class Tag(models.Model):
    name = models.CharField(max_length=30, unique=True, null=True)

    def __unicode__(self):
        return self.name


# test unique of name field
class TagTest(TestCase):

    def test_tag_unique(self):
        t1 = Tag(name='music')
        t1.save()

        with self.assertRaises(IntegrityError):                                                                                                                    
          t2 = Tag(name='music')
          t2.save()

        self.assertEqual(['music'], [ t.name for t in Tag.objects.all() ])

在最后一行我收到此消息

    "An error occurred in the current transaction. You can't "
TransactionManagementError: An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block.

为什么?

修改

我用sqlite作为DB(开发环境)得到这个。

1 个答案:

答案 0 :(得分:0)

如果您正在使用PostgreSQL,那么this就是原因。

修改

请参阅this提交。由于它位于基础后端,所以现在所有后端都有共同的行为。尽管使用了后端,但如果事务需要回滚,则会引发错误。

提示:

使用Model.objects.create(attr="value")代替创建和.save()