Django + Factory Boy:使用Trait创建其他工厂对象

时间:2017-11-21 17:27:34

标签: django factory-boy

是否可以使用Traits(或Factory Boy中的任何其他东西)来触发其他工厂对象的创建?例如:在User-Purchase-Product情况下,我想创建一个用户并告知该用户购买的产品具有以下简单的内容:

UserFactory.create(with_purchased_product=True)

因为调用 UserFactory ProductFactory PurchaseFactory 会感觉太麻烦,然后创建它们之间的关系。必须有一种更简单的方法。

任何帮助都将不胜感激。

1 个答案:

答案 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。也许也可以帮助您。