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 4

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 уже поддерживает автоматические первичные ключи? Смотритедокументацию для более подробного объяснения.