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);