4

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

这里的文档似乎是这样建议的,但是当我将一个类定义为:

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。

4

1 回答 1

3

你的测试方法是错误的。您在这里所做的是更新现有实例,因为您提供的是已使用的主键。将 更改saveforce_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 如何知道是 UPDATE 还是 INSERT。您应该阅读该部分。

你知道 django 已经支持自动主键了吗?有关更多说明,请参阅文档

于 2013-01-22T23:23:16.070 回答