У меня есть модель 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
?
Вы можете сделать это, но я бы не стал переименовывать менеджера в defaults
, потому что теперь objects
не определено, а запросы все к EmployeeType
должны использовать defaults
, например. EmployeeType.defaults.all()
что на самом деле не имеет смысла.
Вы просто хотите добавить дополнительный метод, как описано здесь.
Просто назовите своего менеджера objects = EmployeeTypeManager()
, позвоните своему менеджеру EmployeeTypeManager
(это все еще менеджер по умолчанию), и ваш метод будет просто дополнительным методом менеджера.
Обратите внимание, что get_or_create
возвращает два кортежа объекта и независимо от того, был ли он создан. Итак, в вашем коде first_type
равно (<the object>, False)
, если тип уже существует.
Обратите внимание, что вы поместили это под модель Employee
, но это, конечно, менеджер моделей EmployeeType
.
исправлено на
EmployeeType
вместоEmployee
.