【问题标题】:django.db.utils.IntegrityError: duplicate key value violates unique constraint "package_code_key"django.db.utils.IntegrityError:重复键值违反唯一约束“package_code_key”
【发布时间】:2022-11-05 02:31:36
【问题描述】:

我已经为在 Django 中创建 api 编写了一个测试用例,但我收到了上述错误。我在数据库中看到它创建了一些对象并说错误中有重复的键值。

我的模型是:

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.Destination'

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

我清除了数据库并开始运行测试,但我得到了同样的错误。这个怎么解决??

【问题讨论】:

    标签: django api django-rest-framework django-testing


    【解决方案1】:

    在工厂定义中,您有:

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

    这是使用名为“example.Package”的模型,但在您拥有的示例模型中。

    class Example(models.Model):
    
            package = models.ForeignKey(
                Destination, related_name="packages", on_delete=models.CASCADE
            )
    

    ForeignKey 是模型 Destination。尝试在工厂中更改 Destination 的模型。如果这不是问题,您应该上传您正在使用的其他模型。

    【讨论】:

    • 抱歉,这是一个错字。我编辑了我的代码。我的源代码上的 Destination 也有同样的错误。
    【解决方案2】:

    似乎您已经手动对数据库进行了一些更改(例如删除了您的行)(就像我使用 DBeaver 一样)

    您所需要的 - 运行一个 SQL 查询:

    SELECT setval('"YOUR_TABLE_NAME_id_seq"',
    (SELECT MAX(id) FROM YOUR_TABLE_NAME)+1);
    

    【讨论】:

      猜你喜欢
      • 2019-07-22
      • 2018-03-28
      • 2013-10-08
      • 2016-04-14
      • 2018-12-06
      • 2014-06-19
      • 2021-01-25
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多