有没有办法让FactoryBoy将参数传递给我的Django模型的save()方法?

时间:2019-10-09 02:15:58

标签: factory-boy

我有一个像这样的Django模型:

class NicePerson(models.Model):
    last_name = models.CharField(max_length=100)

    def save(self, make_irish=False, *args, **kwargs):
        """if make_irish is True, prepend last_name with O'"
        if make_irish:
            self.last_name = "O'" + self.last_name

        super(MyModel, self).save(*args, **kwargs)

我有一个FactoryBoy类来构建NicePerson实例

class NicePersonFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = NicePerson

我知道我可以像这样一起使用这些

nice_person = NicePersonFactory(last_name='Shea')

但是如何将“ make_irish”参数传递给我的save()方法?

1 个答案:

答案 0 :(得分:0)

factory_boy使用默认的管理器进行创建,即调用NicePerson.objects.create()NicePerson.objects.get_or_create()

对于您的示例,您可以覆盖那些管理器(在模型定义中):

class NicePersonManager(models.Manager):
    def create(self, *args, **kwargs):
        if kwargs.pop('make_irish', False):
            kwargs.update(...)
        return super().create(*args, **kwargs)

另一种选择是覆盖工厂的_create_get_or_create方法。例如:

class NicePersonFactory(factory.django.DjangoModelFactory):
    @classmethod
    def _create(cls, model_class, *args, **kwargs):
        make_irish = kwargs.pop('make_irish', False)
        instance = model_class(**kwargs)
        instance.save(make_irish=make_irish)
        return instance