factory.DjangoModelFactory 的 _create() 方法在初始化对象时什么时候调用?
When is _create() method of factory.DjangoModelFactory called when initialising an object?
我们正在使用 factoryboy 并且遵循文档似乎可以完成预期的任务,但我正在尝试了解屏幕背后的内容。
我们正在覆盖 factory.DjangoModelFactory 的 _create() 方法以创建自定义用户。但是 class 中没有 init。 python 如何确保每次创建工厂对象时都调用 _create() 方法?
class CustomerFactory(factory.DjangoModelFactory):
class Meta:
model = Customer
@class_method
def _create(cls, model_class, *args, **kwargs):
...... <custom_code>
alex = CustomerFactory()
Factory boy 使用 metaclass 来实现这个结果。
基本上,metaclass (factory.base.FactoryMetaClass) 从您的代码中接收 class 定义,并对其进行转换——就像 Django 对其模型所做的那样。
这发生在 FactoryMetaClass.__new__
.
内
metaclass 还提供了一个 custom __call__
method,当您 运行 CustomerFactory()
.
时,Python 会使用它
那么调用顺序是:
- 您的代码调用
CustomerFactory()
- Python 实际上 运行s
FactoryMetaClass.__call__(CustomerFactory)
- 该函数调用
CustomerFactory.create()
(因为它是 DjangoModelFactory
;其他工厂将默认调用路由到 MyFactory.build()
)
- FactoryBoy 的核心引擎解析参数和声明
- 并将生成的参数列表提供给
CustomerFactory._create(**params)
- 您的代码接管的地方。
我们正在使用 factoryboy 并且遵循文档似乎可以完成预期的任务,但我正在尝试了解屏幕背后的内容。
我们正在覆盖 factory.DjangoModelFactory 的 _create() 方法以创建自定义用户。但是 class 中没有 init。 python 如何确保每次创建工厂对象时都调用 _create() 方法?
class CustomerFactory(factory.DjangoModelFactory):
class Meta:
model = Customer
@class_method
def _create(cls, model_class, *args, **kwargs):
...... <custom_code>
alex = CustomerFactory()
Factory boy 使用 metaclass 来实现这个结果。
基本上,metaclass (factory.base.FactoryMetaClass) 从您的代码中接收 class 定义,并对其进行转换——就像 Django 对其模型所做的那样。
这发生在 FactoryMetaClass.__new__
.
metaclass 还提供了一个 custom __call__
method,当您 运行 CustomerFactory()
.
那么调用顺序是:
- 您的代码调用
CustomerFactory()
- Python 实际上 运行s
FactoryMetaClass.__call__(CustomerFactory)
- 该函数调用
CustomerFactory.create()
(因为它是DjangoModelFactory
;其他工厂将默认调用路由到MyFactory.build()
) - FactoryBoy 的核心引擎解析参数和声明
- 并将生成的参数列表提供给
CustomerFactory._create(**params)
- 您的代码接管的地方。