Django + Factory Boy: используйте Trait для создания других фабричных объектов

Можно ли использовать черты (или что-то еще в Factory Boy) для запуска создания других объектов фабрики? Например: в ситуации «Пользователь-покупка-продукт» я хочу создать пользователя и сообщить, что у этого пользователя есть продукт, приобретенный с помощью чего-то простого:

UserFactory.create(with_purchased_product=True)

Потому что слишком сложно вызвать UserFactory, ProductFactory и PurchaseFactory, а затем создать связь между ними. Должен быть более простой способ сделать это.

Любая помощь будет оценена по достоинству.


person user2937998    schedule 21.11.2017    source источник
comment
Является ли объект Purchase внешним ключом для пользователя? Если это так, вы можете настроить подфабрику на PurchaseFactory для создания пользователя и продукта. factoryboy.readthedocs.io/en/latest/   -  person Robert Townley    schedule 21.11.2017


Ответы (1)


Во-первых, я буду честен с вами: я не знаю, лучший ли это ответ или следует ли он передовой практике Python.

В любом случае, решение, которое я нашел для такого сценария, заключалось в использовании post_generation.

import factory


class UserFactory(factory.DjangoModelFactory):
    class Meta:
        model = User

    name = factory.Faker('name'))

    @factory.post_generation
    def with_purchased_products(self, create, extracted, **kwargs):
        if extracted is not None:
            PurchaseFactory.create(user=self, with_products=extracted)


class PurchaseFactory(factory.DjangoModelFactory):
    class Meta:
        model = Purchase

    user = factory.SubFactory(UserFactory)

    @factory.post_generation
    def with_products(self, create, extracted, **kwargs):
        if extracted is not None:
            ProductFactory.create_batch(extracted, purchase=self)


class ProductFactory(factory.DjangoModelFactory):
    class Meta:
       model = Product

    purchase = factory.SubFactory(PurchaseFactory)

Чтобы сделать эту работу, вам просто нужно:

UserFactory.create(with_purchased_products=10)

И это всего лишь статья, которая помогает узнать больше о Django тестирует подделки и фабрики. Может и вам поможет.

person Pedro Paiva    schedule 21.10.2018