问题描述
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,)
仅当 card
字段在 booking_payment
中具有 payment_type
值时,我才尝试生成字段 [bkg_cts.PAYMENT_CARD,bkg_cts.PAYMENT_CARD_2X]
我怎样才能正确地做到这一点?
SubFactory
中允许 lazy_attribute
吗?
如果可能的话,我希望能够从 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
没有被调用时会发生什么——你必须检查(可能会打开一个问题如果您遇到意外行为,请在项目中!)