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 会使用它

那么调用顺序是:

  1. 您的代码调用 CustomerFactory()
  2. Python 实际上 运行s FactoryMetaClass.__call__(CustomerFactory)
  3. 该函数调用 CustomerFactory.create()(因为它是 DjangoModelFactory;其他工厂将默认调用路由到 MyFactory.build()
  4. FactoryBoy 的核心引擎解析参数和声明
  5. 并将生成的参数列表提供给CustomerFactory._create(**params)
  6. 您的代码接管的地方。