Используйте пользовательский `Менеджер` для создания и извлечения "значений по умолчанию"

У меня есть модель 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?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Обратите внимание, что вы поместили это под модель Employee, но это, конечно, менеджер моделей EmployeeType.

исправлено на EmployeeType вместо Employee.

dirkgroten 29.05.2019 19:04

Другие вопросы по теме