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

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

UserFactory.create(with_purchased_product=True)

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

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

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 с фальшивками и фабриками. Может быть, может помочь вам тоже.

Другие вопросы по тегам