python - Django Factoryboy 在用作默认参数值时失败

标签 python django optional-parameters factory-boy

我有一组工厂,在测试阶段通过一个名为 Create 的便捷函数运行。当我需要引用现有项目时,我会将其作为参数传递,如果不需要,我会使用 FactoryBoy 创建一个新项目:

def Create(project=ProjectFactory()):
    # do stuff with project

我像这样调用该函数:

Create() # new project will be defined
Create(existing_project) # existing project will be used

但是它不起作用,我有很多错误:

E   ProgrammingError: relation "auth_user" does not exist
E   LINE 1: ...user"."is_active", "auth_user"."date_joined" FROM "auth_user...
E                                                                 ^

尝试了几天不同的解决方法后,我发现这个版本有效:

def Create(project=None):
    project = ProjectFactory() if not project else project
    # do stuff with project

对我来说它做了同样的事情,我在这里错过了什么?

最佳答案

请注意,def Create(project=ProjectFactory()): 中的默认参数是在模块加载时绑定(bind)的,本质上是在测试运行程序启动时绑定(bind)的。由于测试运行程序从头开始迁移测试数据库,因此它无法在此时创建和保存项目

在第二个版本中

def Create(project=None):
    project = ProjectFactory() if not project else project

创建项目的代码位于函数内部,因此仅在调用该函数后执行 - 迁移运行之后。

关于python - Django Factoryboy 在用作默认参数值时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36398060/

相关文章:

python - 您可以从 Django ORM 的父类(super class)模型中访问子类模型吗?

DjangoRestFramework - 序列化器验证会引发 KeyError,即使它是由 Perform_create() 方法提供的

python - 我应该使用什么模型字段类型来存储多个 long 类型?

Django url 模板标签 : 'module' object has no attribute 'views'

sql - 存储过程 NULL 参数

c# - 为什么实现中允许的默认值与接口(interface)上定义的默认值不同?

c# - 在 XML 文档中使用 <see cref =""/> 和可选的可为空参数

python - 导入存储在 python 模块中的 csv 数据

python - 有没有办法暂停脚本,直到 ffmpeg 完成文件转换?

python - django-rest-framework-gis 相关领域