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,如果这是相关的。
答案 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。