Когда вызывается метод _create () для factory.DjangoModelFactory при инициализации объекта? - PullRequest
0 голосов
/ 23 сентября 2019

Мы используем factoryboy, и следование документам, кажется, выполняет поставленную задачу, но я пытаюсь понять, что скрывается за экранами.

Мы перезаписываем метод фабрики _create () .jangoModelFactory для создания пользовательских приложений.Однако в классе нет init .Как python гарантирует, что метод _create () вызывается каждый раз, когда создается объект фабрики?

class CustomerFactory(factory.DjangoModelFactory):

      class Meta:
            model = Customer

      @class_method
       def _create(cls, model_class, *args, **kwargs):
           ...... <custom_code>

alex = CustomerFactory()

1 Ответ

0 голосов
/ 23 сентября 2019

Factory boy использует метакласс для достижения этого результата.

По сути, метакласс ( factory.base.FactoryMetaClass ) получает определение класса из вашего кода и преобразует его - так же, какДжанго делает со своими моделями.Это происходит внутри FactoryMetaClass.__new__.

Метакласс также предоставляет пользовательский __call__ метод , который используется Python при запуске CustomerFactory().

Тогда порядок вызова будет таким:

  1. Ваш код вызывает CustomerFactory()
  2. Python фактически запускается FactoryMetaClass.__call__(CustomerFactory)
  3. Эта функция вызывает CustomerFactory.create() (поскольку это DjangoModelFactory, другие фабрики направляют вызов по умолчанию на MyFactory.build())
  4. Основной механизм FactoryBoy разрешает параметры и объявления
  5. и предоставляет результирующий список параметров в CustomerFactory._create(**params)
  6. Где ваш код вступает во владение.
...