【问题标题】:Factory_boy not creating RelatedFactory in TraitFactory_boy 没有在 Trait 中创建 RelatedFactory
【发布时间】:2021-08-30 21:16:21
【问题描述】:

我有一个Purchase 模型和一个PurchaseInfo 模型。 PurchaseInfo 有一个指向 Purchase 的外键。我正在尝试修改现有的 Purchase 工厂,它将同时使用 RelatedFactory 创建 PurchaseInfo,因为它是反向外键关系。唯一的事情是我想使用污点,以便我可以控制PurchaseInfo 中字段的值。通常,当我创建Purchase 之类的p = PurchaseFactory() 时,PurchaseInfo 会在其中创建空字段。如果我像p = PurchaseFactory(info=True)一样创建Purchase,这样我就可以通过Taint获得字段修改,PurchaseInfo根本不会创建。

我有一种感觉,将RelatedFactory 放入 Taint 是不可行的。这样做的正确方法是什么?

型号:


class Purchase(Model):
    ...

class PurchaseInfo(Model):
    purchase = models.ForeignKey(Purchase, on_delete=models.CASCADE, unique=True, db_index=True)
    lock = DateTimeField(null=True)
    lock_by = ForeignKey(...
class PurchaseInfoFactory(DjangoModelFactory):
    class Meta:
        model = PurchaseInfoField

    lock = None
    lock_by = None

class PurchaseFactory(DjangoModelFactory):
    class Meta:
        model = Purchase

    info = RelatedFactory(PurchaseInfoFactory,
                          factory_related_name='purchase')

    class Params:
        info = Trait(internalfield=RelatedFactory(PurchaseInfoFactory,
                                                  factory_related_name='purchase',
                                                  lock=timezone.now() - relativedelta(months=1),
                                                  lock_by=SubFactory(UserFactory, user_id=1)))

【问题讨论】:

  • 你试过SubFactory这个吗??
  • 尝试为特征使用不同的名称
  • @bdbd,你的意思是“info =”行,对吧?我确实试过了。
  • @Sabil 我认为这里不能使用SubFactory。 SubFactory 将在父级之前创建,我无法将父级的 ID 传递给它,因为它不存在。

标签: python django factory-boy


【解决方案1】:

我不喜欢我的解决方案,但这就是我所做的。我派生了一个带有备用相关工厂的二级工厂。这行得通。

class PurchaseFactory(DjangoModelFactory):
    class Meta:
        model = Purchase

    info = RelatedFactory(PurchaseInfoFactory,
                          factory_related_name='purchase')
class InfoPurchaseFactory(DjangoModelFactory):
    class Meta:
        model = Purchase

    info = Trait(internalfield=RelatedFactory(PurchaseInfoFactory,
                                                  factory_related_name='purchase',
                                                  lock=timezone.now() - relativedelta(months=1),
                                                  lock_by=SubFactory(UserFactory, user_id=1)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-04
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多