如何在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
相关产品推荐
相关产品推荐

