2013-07-31 173 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