Используйте собственный `Manager` для создания и извлечения значений по умолчанию - PullRequest
0 голосов
/ 29 мая 2019

У меня есть и Employee модель и EmployeeType модель, с Employee, имеющим атрибут с именем Employee.employee_type, который имеет тип EmployeeType.

В настоящее время при создании клиента,мы запускаем что-то, чтобы создать значения по умолчанию для EmployeeType.Прямо сейчас, эта логика находится в методе в модуле, который обрабатывает новый клиент, который создается ... но я думал, что лучшее место для этого было бы с моделью EmployeeType.

У меня такой вопрос - было бы целесообразно создать собственный атрибут Manager для EmployeeType, который создает и / или выбирает эти типы по умолчанию?См. Следующее, что, по моему мнению, я пытаюсь выполнить:

    class DefaultValueEmployeeTypeManager(models.Manager):
        def get_or_create_default_values(self):
            first_type = self.model.objects.get_or_create(name='First Type')
            second_type = self.model.objects.get_or_create(name='Second Type')
            third_type = self.model.objects.get_or_create(name='Third Type')

            return (first_type, second_type, third_type)

    class Employee(models.Model):
        first_name = models.CharField(max_length=255)
        last_name = models.CharField(max_length=255)

        defaults = DefaultValueEmployeeTypeManager()


    # Code in another file, handling the setup of a new client
    from models import EmployeeType

    def create_new_client(client):
        # make sure the default values are there
        EmployeeType.defaults.get_or_create_default_values()

Мой вопрос заключается в том, является ли это приемлемым / ожидаемым поведением для объекта Manager для обработки?Или это просто @classmethod (или аналогичный) на модели EmployeeType?

1 Ответ

1 голос
/ 29 мая 2019

Вы можете сделать это, но я бы не стал переименовывать менеджера в defaults, потому что теперь objects не определено и все запросы на EmployeeType должны использовать defaults, например. EmployeeType.defaults.all() что на самом деле не имеет смысла.

Вы просто хотите добавить дополнительный метод, как описано здесь .

Просто назовите своего менеджера objects = EmployeeTypeManager(), позвоните своему менеджеру EmployeeTypeManager (это по-прежнему менеджер по умолчанию), а ваш метод - просто дополнительный метод менеджера.

Обратите внимание, что get_or_create возвращает двойной кортеж объекта и независимо от того, был ли он создан. Так что в вашем коде first_type равно (<the object>, False), если тип уже существует.

Обратите внимание, что вы указали это для модели Employee, но это, конечно, EmployeeType менеджер моделей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...