8

在 FactoryBoy 中定义 ModelFactory 时,我需要访问由 SubFactory 创建的另一个模型的属性并将其分配给此 ModelFactory 的属性。

这就是我想要做的:

import factory
class MyModelFactory(factory.DjangoModelFactory):
    FACTORY_FOR = MyModel

    created_by = factory.SubFactory(AdminUserFactory)**.id**

显然这不起作用,因为没有 AdminUser 对象可以访问 MyModelFactory 类定义中的 id。

这就是我所做的,但它很丑:

import factory
class MyModelFactory(factory.DjangoModelFactory):
    FACTORY_FOR = MyModel

    dummy_created_by = factory.SubFactory(AdminUserFactory)
    created_by = factory.LazyAttribute(lambda o: o.dummy_created_by.id)

    @classmethod
    def _create(cls, target_class, *args, **kwargs):
        del kwargs['dummy_created_by']
        return super(MyModelFactory, cls)._created(
            target_class, *args, **kwargs)

我试图通读Factory_Boy 文档,但没有看到允许我懒惰地访问该属性的类或函数。有没有人有什么建议?

4

3 回答 3

8

从 factoryboy 2.4.0 开始,您可以使用exclude。这使您可以向工厂添加一个不会传递给模型类的参数

import factory
class MyModelFactory(factory.DjangoModelFactory):
    created_by = factory.SubFactory(AdminUserFactory)
    created_by_id = factory.LazyAttribute(lambda o: o.created_by.id)

    class Meta:
        model = MyModel
        exclude = ['created_by']

我已将 OPs 示例转换为使用created_by_id,但您可以重命名它以使其对您有意义。

于 2018-07-06T10:23:39.930 回答
5

使用SelfAttribute

class MyModelFactory(factory.django.DjangoModelFactory):
    FACTORY_FOR = MyModel
    dummy_created_by = factory.SubFactory(AdminUserFactory)
    created_by = factory.SelfAttribute('dummy_created_by.id')
于 2014-06-16T23:18:46.670 回答
-2

尝试使用Mixer

from mixer.backend.django import mixer

mixer.blend(MyModel, created_by=lambda: mixer.blend(AdminUser).id)
于 2014-01-07T19:19:27.737 回答