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

ogr*_*ogr 1 factory-boy

我有一个这样的工厂:

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,
            )
Run Code Online (Sandbox Code Playgroud)

card仅当该booking_payment字段具有payment_type以下值时,我才尝试生成该字段[bkg_cts.PAYMENT_CARD, bkg_cts.PAYMENT_CARD_2X]

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

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

如果可能的话,我希望能够从 PayInFactory 修改卡字段,如下所示:

>>> PayInFactory(card__user=some_user)
Run Code Online (Sandbox Code Playgroud)

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

谢谢 !

小智 6

解决办法在于factory.Maybe

\n
class PayInFactory(factory.django.DjangoModelFactory):\n    class Meta:\n        model = models.PayIn\n\n    card = factory.Maybe(\n        factory.LazyAttribute(\n            lambda o: o.booking_payment and o.booking_payment.payment_type in ...\n        ),\n        factory.SubFactory(\n            CardFactory,\n            # Fetch \'user\' one level up from CardFactory: PayInFactory\n            user=factory.SelfAttribute(\'..user\'),\n        ),\n    )\n
Run Code Online (Sandbox Code Playgroud)\n

但是,我还没有测试额外的参数是否实际传递给CardFactory,也没有测试当CardFactory不调用 \xe2\x80\x94 时会发生什么,你必须检查(如果你得到,可能会在项目上提出一个问题)意想不到的行为!)。

\n