Django未对重复主键引发IntegrityError

4 投票
1 回答
2299 浏览
提问于 2025-04-17 13:23

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并没有改变结果。

我是不是漏掉了关于主键字段的什么东西?

我的数据库后台是MySQL,这个信息有用吗?

1 个回答

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 是怎么知道是更新还是插入的。你应该看看那一部分。

你知道 Django 已经支持自动生成主键吗?可以查看 文档,了解更多信息。

撰写回答