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), исключение возникает правильно. Установка уникального = 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 Docs объясняет, как Django знает, нужно ли ОБНОВИТЬ или ВСТАВИТЬ. Вы должны прочитать этот раздел.

Знаете ли вы, что django уже поддерживает автоматические первичные ключи? Смотрите документацию для более подробного объяснения.

Другие вопросы по тегам