django没有为重复的主键引发IntegrityError

时间:2013-01-22 23:18:02

标签: python django django-testing

django是否强制主键的唯一性?

文档here似乎建议如此,但是当我将类定义为:

class Site(models.Model):
    id = models.IntegerField(primary_key=True)

并在测试用例中测试此约束:

class SiteTestCase(TestCase):
    def setUp(self):
        self.site = Site(id=0, name='Site')
        self.site.save()

    def tearDown(self):
        self.site.delete()

    def test_unique_id(self):
        with self.assertRaises(IntegrityError):
            badSite = Site(id=0, name='Bad Site')
            badSite.save()
            badSite.delete()

测试失败。

如果我在普通字段上测试(primary_key = False,unique = True),则会正确引发异常。在id字段中设置unique = True不会改变结果。

我在这里缺少关于primary_key字段的内容吗?

我的数据库后端是MySQL,如果这是相关的。

1 个答案:

答案 0 :(得分:3)

您的测试方法有误。你在这里做的是更新现有实例,因为你提供了一个已经使用过的主键。将save更改为force_insert,如此。

def test_unique_id(self):
        with self.assertRaises(IntegrityError):
            badSite = Site(id=0, name='Bad Site')
            badSite.save(force_insert=True)
            badSite.delete()

django文档解释了django knows whether to UPDATE or INSERT的方式。你应该阅读那一节。

您是否知道django已经支持自动主键?有关详细说明,请参阅the documentation