2013-07-31 117 views
2

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

这就是我想做的事:

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 docs阅读,但没有看到一个类或函数,可以让我懒洋洋地访问属性。有没有人有什么建议?

+1

有一个原因,你不能只是建立相关模型,并通过该对象中MyModelFactory.create( )? –

+0

@BrianDant是的,你绝对可以做到这一点。我只是在寻找一种能够一气呵成,尽可能干的事情。 – emispowder

+0

很酷。感谢您的澄清。 –

回答

0

尝试使用Mixer

from mixer.backend.django import mixer 

mixer.blend(MyModel, created_by=lambda: mixer.blend(AdminUser).id) 
+0

谢谢@klen,我将不得不查看调音台。但是在这个项目中,我们致力于FactoryBoy,所以我们正在寻找一个FactoryBoy解决方案。 – emispowder

1

使用SelfAttribute

class MyModelFactory(factory.django.DjangoModelFactory): 
    FACTORY_FOR = MyModel 
    dummy_created_by = factory.SubFactory(AdminUserFactory) 
    created_by = factory.SelfAttribute('dummy_created_by.id') 
+0

如果我需要使用'SelfAttribute'来分配方法调用的结果而不是属性呢? – nnyby

+0

是否有可能获得'dummy_created_by'的子对象?例如,如果'AdminUserFactory'使用一些'UserRight'子行创建一个'AdminUser',我可以获得UserRight列表或ID吗?就像'created_by = factory.SelfAttribute('dummy_created_by__user_right.id')'? (我意识到我可以factory.create UserRights,我只是试图保持代码整齐地封装。) – Chris