You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django测试用例报IntegrityError重复键值错误,如何解决?

解决Django测试中unique constraint重复键错误的方案

核心问题分析

错误提示duplicate key value violates unique constraint "package_code_key",说明你的Destination模型(对应PackageFactory的model)中存在一个名为package_code的唯一字段,但PackageFactory在生成实例时重复生成了相同的package_code值,触发了唯一约束冲突。同时你的测试代码里还存在factory语法错误,会加剧问题。

分步修复方案

1. 修复ExampleFactory的语法错误

你的ExampleFactory中tour字段的写法错误,应该用factory.SubFactory而非factory.TourFactory:

class ExampleFactory(factory.django.DjangoModelFactory):
    package = factory.SubFactory(PackageFactory)
    user = factory.SubFactory(UserFactory)
    # 修正此处的语法错误
    tour = factory.SubFactory(TourFactory)

    class Meta:
        model = 'example.Example'

2. 给PackageFactory添加唯一字段的动态生成逻辑

针对Destination模型的package_code唯一字段,在PackageFactory中用factory.Sequence生成唯一值,确保每次创建实例时字段值不重复:

class PackageFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = 'example.Destination'
    
    # 添加这一行,根据实际字段名调整(如果字段不是package_code,替换成真实字段名)
    package_code = factory.Sequence(lambda n: f"PACKAGE_{n:04d}")

如果package_code是自动生成的(比如通过信号或模型方法),可以禁用自动生成逻辑,直接在factory中指定唯一值,或者调整自动生成规则避免冲突。

3. 确保测试数据库的正确重置

  • 使用Django的TestCase类编写测试,它会在每个测试方法执行后自动回滚数据库,避免残留数据导致的冲突。
  • 如果是手动运行factory代码测试,每次运行前彻底清空数据库并重建表结构:
    python manage.py flush
    python manage.py migrate
    

4. 排查其他可能的冲突源

  • 检查是否有测试前置代码或信号函数,在factory创建实例前已经手动创建了Destination实例,导致package_code重复。
  • 确认Destination模型的package_code字段是否设置了unique=True,如果是误设置可以调整,但根据错误提示应该是业务需要的约束。

内容的提问来源于stack exchange,提问作者Reactoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:24:33