Есть ли способ заставить FactoryBoy передать параметр в метод save () моей модели Django? - PullRequest
0 голосов
/ 09 октября 2019

У меня есть модель 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 голосов
/ 09 октября 2019

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
...