【问题标题】:Django Factory Boy iterate over related parentDjango Factory Boy 遍历相关父级
【发布时间】:2016-10-05 09:35:05
【问题描述】:

我有一个包含客户端、Draftschedules、LineItems 和服务器的项目。

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

  • 每个客户端都有很多服务器

  • 每个 LineItem 都有一个服务器

我有一些代码可以使用随机数据为每个 DraftSchedule 生成 LineItems。然而,生成的 LineItems 包含不属于 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 是相关名称,但函数不可迭代,所以我有点卡住了

这可能吗,还是我应该从不同的角度来解决这个问题?

【问题讨论】:

    标签: python django fixtures factory-boy


    【解决方案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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 2018-05-08
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 2020-05-03
      相关资源
      最近更新 更多