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), то исключение создается правильно. Установка значения unique=True в поле id не изменяет результат.
Есть ли что-то в полях primary_key, что я пропустил - здесь?
Мой сервер базы данных-это MySQL, если это уместно.
1 ответ:
Ваш метод неправильный. То, что вы делаете здесь, - это обновление существующего экземпляра, так как вы предоставляете уже используемый первичный ключ. Измените
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 уже поддерживает автоматические первичные ключи? Смотритедокументацию для более подробного объяснения.