如何根据父属性的条件生成子工厂
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
没有被调用时会发生什么——你必须检查(也许打开如果您遇到意外行为,则会出现项目问题!)。
我有一个这样的工厂:
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
没有被调用时会发生什么——你必须检查(也许打开如果您遇到意外行为,则会出现项目问题!)。