使用Model Bakery创建Person实例触发Django外键约束错误如何解决?
错误原因
你在baker_recipes.py中直接创建了未写入数据库的User内存实例test_user,再将该实例绑定到Person的Recipe中。这个User实例没有执行save()操作入库,不存在于测试库的auth_user表中,也没有合法的主键ID。
当调用baker.make_recipe创建Person实例时,Model Bakery会直接取用你传入的未入库User实例的ID作为外键值写入Person表,触发外键约束校验失败,抛出完整性错误。
修复方案
按需选择以下任意一种方案即可:
- 方案1:简化Recipe定义,通过双下划线关联语法指定关联字段属性,让Model Bakery自动创建并保存关联的User实例
修改baker_recipes.py代码如下:
from model_bakery.recipe import Recipe from .models import Person person = Recipe(Person, user__username="test_user")
这种写法下,Model Bakery在生成Person实例时,会自动创建一个用户名为test_user的User实例、写入数据库后再关联到Person上,自动处理外键依赖。
- 方案2:单独定义User的Recipe,再关联到Person的Recipe中,适合需要复用User配置的场景
修改baker_recipes.py代码如下:
from model_bakery.recipe import Recipe from django.contrib.auth import get_user_model from .models import Person User = get_user_model() test_user = Recipe(User, username="test_user") person = Recipe(Person, user=test_user)
Recipe是延迟执行的对象,只有调用make_recipe时才会实际创建并保存关联的User实例,不会出现提前生成无效内存实例的问题。
内容的提问来源于stack exchange,提问作者Andrew Einhorn
相关产品推荐
相关产品推荐

