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
相关产品推荐
相关产品推荐

