我有一个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
(或类似名称)?
答案 0 :(得分:1)
您可以这样做,但是我不会将管理器重命名为defaults
,因为现在objects
是未定义的,并且EmployeeType
上的所有所有查询都需要使用defaults
,例如EmployeeType.defaults.all()
并没有任何意义。
您只想添加一个额外的方法,如所述的here。
只需命名您的经理objects = EmployeeTypeManager()
,然后叫您的经理EmployeeTypeManager
(它仍然是默认经理),您的方法就只是一个额外的经理方法。
请注意,get_or_create
返回对象的二元组以及是否已创建。因此,如果类型已经存在,则在您的代码中first_type
是(<the object>, False)
。
请注意,您将其置于Employee
模型下,但是它当然是EmployeeType
模型管理器。