Django Factory Boy 遍历相关父级
Django Factory Boy iterate over related parent
我有一个包含客户端、草稿计划、订单项和服务器的项目。
每个客户都有一个DraftSchedule,每个Draftschedule有很多Lineitems
每个客户端有多个服务器
每个 LineItem 都有一个服务器
我有一些代码可以用随机数据为每个 DraftSchedule 生成 LineItems。但是,生成的 LineItems 包含实际上不属于 Draftschedule Client
的服务器
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()
时,它 returns 一个新的 LineItem 对象,我可以保证 LineItem 上的服务器实际上由与 DraftSchedule
关联的客户端拥有
我试过以下方法:
servers = factory.Iterator(lambda x: x.draftschedule.client.servers.all())
其中 client.servers
是相关名称,但该函数不可迭代,所以我有点卡住了
这是可能的还是我应该从不同的角度来解决这个问题?
您可以尝试使用 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]
我有一个包含客户端、草稿计划、订单项和服务器的项目。
每个客户都有一个DraftSchedule,每个Draftschedule有很多Lineitems
每个客户端有多个服务器
每个 LineItem 都有一个服务器
我有一些代码可以用随机数据为每个 DraftSchedule 生成 LineItems。但是,生成的 LineItems 包含实际上不属于 Draftschedule Client
的服务器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()
时,它 returns 一个新的 LineItem 对象,我可以保证 LineItem 上的服务器实际上由与 DraftSchedule
我试过以下方法:
servers = factory.Iterator(lambda x: x.draftschedule.client.servers.all())
其中 client.servers
是相关名称,但该函数不可迭代,所以我有点卡住了
这是可能的还是我应该从不同的角度来解决这个问题?
您可以尝试使用 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]