是否可以使用Traits(或Factory Boy中的任何其他东西)来触发其他工厂对象的创建?例如:在User-Purchase-Product情况下,我想创建一个用户并告知该用户购买的产品具有以下简单的内容:
UserFactory.create(with_purchased_product=True)
因为调用 UserFactory , ProductFactory 和 PurchaseFactory 会感觉太麻烦,然后创建它们之间的关系。必须有一种更简单的方法。
任何帮助都将不胜感激。
答案 0 :(得分:2)
首先,我将对您诚实:我不知道这是否是最佳答案,还是遵循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 tests with fakes & factories。也许也可以帮助您。