15

で作成されたオブジェクトを渡すために呼び出しfactory.LazyAttribute内で使用しています。これはうまくいきます。SubFactoryfactory_parent

しかし、作成したオブジェクトを に渡すと、RelatedFactoryLazyAttribute表示されなくなりfactory_parent、失敗します。

これはうまくいきます:

class OKFactory(factory.DjangoModelFactory):
    class = Meta:
        model = Foo
        exclude = ['sub_object']

    sub_object = factory.SubFactory(SubObjectFactory)

    object = factory.SubFactory(ObjectFactory,
        sub_object=factory.LazyAttribute(lambda obj: obj.factory_parent.sub_object))

への同一の呼び出しLazyAttributeはここで失敗します:

class ProblemFactory(OKFactory):
    class = Meta:
        model = Foo
        exclude = ['sub_object', 'object']

    sub_object = factory.SubFactory(SubObjectFactory)

    object = factory.SubFactory(ObjectFactory,
        sub_object=factory.LazyAttribute(lambda obj: obj.factory_parent.sub_object))

    another_object = factory.RelatedFactory(AnotherObjectFactory, 'foo', object=object)

同一のLazyAttribute呼び出しは factory_parent を見ることができなくなり、AnotherObject値にのみアクセスできます。LazyAttribute は次のエラーをスローします。

AttributeError: The parameter sub_object is unknown. Evaluated attributes are...[then lists all attributes of AnotherObjectFactory]

これを回避する方法はありますか?

sub_object=sub_object を ObjectFactory 呼び出しに入れることはできません。

    sub_object = factory.SubFactory(SubObjectFactory)
    object = factory.SubFactory(ObjectFactory, sub_object=sub_object)

私がそうするなら:

    object2 = factory.SubFactory(ObjectFactory, sub_object=sub_object)

2 番目の sub_object が作成されますが、両方のオブジェクトが同じ sub_object を参照する必要があります。私はSelfAttribute無駄にしようとしました。

4

2 に答える 2

11

に渡されたパラメーターをオーバーライドする機能を活用して、RelatedFactory目的を達成できると思います。

たとえば、次のようになります。

class MyFactory(OKFactory):

    object = factory.SubFactory(MyOtherFactory)
    related = factory.RelatedFactory(YetAnotherFactory)  # We want to pass object in here

の値がobject事前にわかっていれば、次のように機能させることができます。

object = MyOtherFactory()
thing = MyFactory(object=object, related__param=object)

これと同じ命名規則を使用して、オブジェクトをRelatedFactorymain 内に渡すことができFactoryます。

class MyFactory(OKFactory):

    class Meta:
        exclude = ['object']

    object = factory.SubFactory(MyOtherFactory)
    related__param = factory.SelfAttribute('object')
    related__otherrelated__param = factory.LazyAttribute(lambda myobject: 'admin%d_%d' % (myobject.level, myobject.level - 1))
    related = factory.RelatedFactory(YetAnotherFactory)  # Will be called with {'param': object, 'otherrelated__param: 'admin1_2'}
于 2015-11-10T10:27:40.287 に答える