You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Factory Boy中向post_generation传递__init__/.create()参数?

解决方法

错误原因很明确:你在工厂的Meta.exclude里排除了num_participants,所以这个参数不会被赋值给生成的Project实例。而post_generation方法中的self是生成的Project对象,自然没有num_participants属性,导致报错。

下面是两种可行的修复方式:

方式一:直接访问工厂实例的参数

利用模型实例关联的工厂对象(self._factory)来获取num_participants参数:

class FullProjectFactory(DjangoModelFactory):
    class Meta:
        model = Project
        exclude = ("num_participants",)

    num_participants = 1
    name = Sequence(lambda n: f"full_test_project_{n}")

    @post_generation
    def create_related_objects(self, create, extracted, **kwargs):
        if not create:
            return

        # 通过工厂实例获取num_participants
        ParticipantFactory.create_batch(self._factory.num_participants, project=self)

方式二:使用Params类定义工厂专属参数(推荐)

用Params类明确区分模型字段和工厂专属参数,语义更清晰,也更符合factory_boy的最佳实践:

class FullProjectFactory(DjangoModelFactory):
    class Meta:
        model = Project

    # 定义工厂专属参数,不会传递给模型
    class Params:
        num_participants = 1

    name = Sequence(lambda n: f"full_test_project_{n}")

    @post_generation
    def create_related_objects(self, create, extracted, num_participants=None, **kwargs):
        if not create:
            return
        # 用传入的参数或默认值
        count = num_participants or self.factory._meta.params['num_participants'].default
        ParticipantFactory.create_batch(count, project=self)

两种方式下,你原来的调用代码p = FullProjectFactory.create(num_participants=10)都可以正常工作,会生成包含10个Participant的Project实例。

内容的提问来源于stack exchange,提问作者user3565923

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:02:12