2016-10-05 57 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]