如何根据父属性的条件生成子工厂

how to generate a subfactory based on condition of a parent attribute

我有一个这样的工厂:

class PayInFactory(factory.DjangoModelFactory):
    class Meta:
        model = PayIn
  
    @factory.lazy_attribute
    def card(self):
        if self.booking_payment and self.booking_payment.payment_type in [bkg_cts.PAYMENT_CARD, bkg_cts.PAYMENT_CARD_2X]:
            factory.SubFactory(
                CardFactory,
                user=self.user,
            )

仅当 booking_payment 字段在 [bkg_cts.PAYMENT_CARD, bkg_cts.PAYMENT_CARD_2X]

中具有 payment_type 值时,我才尝试生成字段 card

代码进入该语句但卡片字段在生成后为空。

我怎样才能正确地做到这一点? 在 lazy_attribute 中允许 SubFactory 吗?

如果可能的话,我希望能够从 PayInFactory 修改 Card 字段:

>>> PayInFactory(card__user=some_user)

PostGeneration 不会执行,因为我需要此 Card 在调用创建之前可用。我覆盖了 _create,它可能会使用该卡(如果可用)。

谢谢!

解决方法在于factory.Maybe:

class PayInFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = models.PayIn

    card = factory.Maybe(
        factory.LazyAttribute(
            lambda o: o.booking_payment and o.booking_payment.payment_type in ...
        ),
        factory.SubFactory(
            CardFactory,
            # Fetch 'user' one level up from CardFactory: PayInFactory
            user=factory.SelfAttribute('..user'),
        ),
    )

但是,我还没有测试额外的参数是否真的传递给了 CardFactory,也没有测试 CardFactory 没有被调用时会发生什么——你必须检查(也许打开如果您遇到意外行为,则会出现项目问题!)。