2016-10-05 61 views
0

我有一個客戶端,Draftschedules,LineItems和Servers項目。Django Factory Boy迭代相關的父項

  • 每個客戶端有一個單一的DraftSchedule,每個Draftschedule有很多了LineItem

  • 每個客戶有許多服務器

  • 每個LineItem有一臺服務器

enter image description here

I有一些代碼可以爲隨機數據生成每個DraftSchedule的LineItems。然而,導致了LineItem包含實際上不是由Draftschedule客戶

class LineItemFactory(factory.django.DjangoModelFactory): 
    class Meta: 
     model = LineItem 

    line_item_type = factory.Iterator(LineItemType.objects.all()) 
    draftschedule = factory.Iterator(DraftSchedule.objects.all()) 

    servers = factory.Iterator(Server.objects.all()) # <----- Problem line 

    cost = factory.LazyAttribute(lambda x: faker.pydecimal(2, 2, positive=True)) 
    detail = factory.LazyAttribute(lambda x: faker.sentence()) 
    ... 

我想限制服務器的選擇設置爲只能由正在爲創建於訂單的Draftschedule的父客戶端所擁有的服務器所擁有的服務器。

所以,當我打電話LineItemFactory()它返回一個新的LineItem對象,我可以garantee上LineItem的服務器實際上是由與DraftSchedule

我嘗試了以下相關的客戶端擁有:

servers = factory.Iterator(lambda x: x.draftschedule.client.servers.all()) 

其中client.servers是相關的名稱,但功能沒有可迭代的,所以我有點卡住

這是可能的,或者我應該從不同的角度解決這個問題?

回答

1

你可以嘗試使用lazy_attribute_sequence

@factory.lazy_attribute_sequence 
def servers(obj, seq): 
    all_servers = obj.draftschedule.client.servers.all() 
    nb_servers = all_servers.count() 
    return all_servers[seq % nb_servers]