使用自定义的“经理”来创建和获取“默认值”

时间:2019-05-29 16:41:05

标签: python django

我有一个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 个答案:

答案 0 :(得分:1)

您可以这样做,但是我不会将管理器重命名为defaults,因为现在objects是未定义的,并且EmployeeType上的所有所有查询都需要使用defaults,例如EmployeeType.defaults.all()并没有任何意义。

您只想添加一个额外的方法,如所述的here

只需命名您的经理objects = EmployeeTypeManager(),然后叫您的经理EmployeeTypeManager(它仍然是默认经理),您的方法就只是一个额外的经理方法。

请注意,get_or_create返回对象的二元组以及是否已创建。因此,如果类型已经存在,则在您的代码中first_type(<the object>, False)

请注意,您将其置于Employee模型下,但是它当然是EmployeeType模型管理器。