Django.db.utils.IntegrityError: дублирующее значение ключа нарушает уникальное ограничение "package_code_key"

Я написал тестовый пример для create api в Django, но получаю вышеуказанную ошибку. Я вижу в базе данных он создает некоторые объекты и говорит, что есть дублирующее значение ключа в ошибке.

Моя модель:

class Example(models.Model):

    package = models.ForeignKey(
        Destination, related_name="packages", on_delete=models.CASCADE
    )

    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        null=True,
        related_name="user_packages",
    )

    tour = models.ForeignKey(
        Tours,
        on_delete=models.CASCADE,
        null=True,
        related_name="tour_packages",
    )

Мой тестовый пример выглядит следующим образом:

import factory

# Define your factories
class PackageFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = 'example.Package'

class UserFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = 'example.User'

class TourFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = 'example.Tour'

class ExampleFactory(factory.django.DjangoModelFactory):
    package = factory.SubFactory(PackageFactory)
    user = factory.SubFactory(UserFactory)
    tour = factory.TourFactory(TourFactory)

    class Meta:
        model = 'example.Example'

# And now, create a new example instance together with all related models.
example = ExampleFactory()

Я очистил базу данных и начал выполнять тест, но получаю ту же ошибку. Как решить эту проблему?

В определении фабрики у вас есть:

class PackageFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = 'example.Package'

Это использует модель с именем 'example.Package', но в модели Example у вас есть.

class Example(models.Model):

        package = models.ForeignKey(
            Destination, related_name="packages", on_delete=models.CASCADE
        )

ForeignKey относится к модели Destination. Попробуйте изменить модель в фабрике для Destination. Если проблема не в этом, вам следует загрузить другие модели, которые вы используете.

Похоже, что вы вручную внесли некоторые изменения в базу данных (например, удалили строку) (как я с помощью DBeaver)

Все, что вам нужно - это выполнить один SQL-запрос:

SELECT setval('"YOUR_TABLE_NAME_id_seq"',
(SELECT MAX(id) FROM YOUR_TABLE_NAME)+1);
Вернуться на верх