Django Factory Boy迭代相关的父

时间:2016-10-05 09:35:05

标签: python django fixtures factory-boy

我有一个包含Clients,Draftschedules,LineItems和Servers的项目。

  • 每个客户都有一个DraftSchedule,每个Draftschedule都有很多Lineitems

  • 每个客户都有许多服务器

  • 每个LineItem都有一个单服务器

enter image description here

我有一些代码可以为每个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())
    ...

我想将服务器选择集限制为仅为正在为其创建Lineitem的Draftschedule的父客户端拥有的服务器。

因此,当我调用LineItemFactory()时,它会返回一个新的LineItem对象,我可以保证LineItem上的服务器实际上由与DraftSchedule关联的客户端拥有

我尝试了以下内容:

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

其中client.servers是相关名称,但该函数不可迭代,所以我有点卡住

这是可能的,还是我应该从另一个角度解决问题?

1 个答案:

答案 0 :(得分:2)

您可以尝试使用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]