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