Django未对重复主键引发IntegrityError
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 已经支持自动生成主键吗?可以查看 文档,了解更多信息。