Python django应用程序中模型上的自连接是可接受的模式吗?

Python django应用程序中模型上的自连接是可接受的模式吗?,python,django,Python,Django,如果这个问题太主观,我道歉 如果你打算结束这个问题:请评论一个更合适的地方张贴的建议 我是django和python的新手,我正在构建一个测试应用程序,用于跟踪员工及其经理 我想设置域模型,以便只有一个员工列表,其中任何一个都可以是经理,所有这些都可以由指定为经理的任何其他员工管理 为了实现这一点,我在Employee模型上进行了一次自联接,并设置了一个is_manager标志来跟踪谁是经理,谁不是。请参见下面的模型 这是一种可以接受的模式吗 我担心它违反了我没有考虑的设计原则,而且作为一个傻瓜

如果这个问题太主观,我道歉

如果你打算结束这个问题:请评论一个更合适的地方张贴的建议

我是django和python的新手,我正在构建一个测试应用程序,用于跟踪员工及其经理

我想设置域模型,以便只有一个员工列表,其中任何一个都可以是经理,所有这些都可以由指定为经理的任何其他员工管理

为了实现这一点,我在Employee模型上进行了一次自联接,并设置了一个is_manager标志来跟踪谁是经理,谁不是。请参见下面的模型

这是一种可以接受的模式吗

我担心它违反了我没有考虑的设计原则,而且作为一个傻瓜,我正走进一个毛茸茸的陷阱

非常感谢您抽出时间

应用程序的models.py:

class OrganizationTitle(models.Model):
    def __str__(self):
        return "{}".format(self.organization_title_name)
    organization_title_name = models.CharField(max_length=150, unique=True)


class ClassificationTitle(models.Model):
    def __str__(self):
        return "{}".format(self.classification_title_name)
    classification_title_name = models.CharField(max_length=150, unique=True)


class WorkingTitle(models.Model):
    def __str__(self):
        return "{}".format(self.working_title_name)
    working_title_name = models.CharField(max_length=150, unique=True)


class Category(models.Model):
    def __str__(self):
        return "{}".format(self.category_name)
    category_name = models.CharField(max_length=150, unique=True)


class Department(models.Model):
    def __str__(self):
        return "{}".format(self.department_name)
    department_name = models.CharField(max_length=150, unique=True)


class Employee(models.Model):
    first_name = models.CharField(max_length=150)
    last_name = models.CharField(max_length=150)
    org_title = models.ForeignKey(OrganizationTitle, blank=True, null=True, on_delete=models.SET_NULL)
    manager = models.ForeignKey('self', null=True, blank=True, on_delete=models.SET_NULL)
    manager_email = models.EmailField(max_length=50, blank=True, null=True)
    hire_date = models.DateField(blank=True, null=True)
    classification_title = models.ForeignKey(ClassificationTitle, blank=True, null=True, on_delete=models.SET_NULL)
    working_title = models.ForeignKey(WorkingTitle, blank=True, null=True, on_delete=models.SET_NULL)
    email_address = models.EmailField(max_length=250, blank=False, unique=True,
                                      error_messages={'unique': 'An account with this email exist.',
                                                      'required': 'Please provide an email address.'})
    category = models.ForeignKey(Category, blank=True, null=True, on_delete=models.SET_NULL)
    is_substitute = models.BooleanField(default=False)
    department = models.ForeignKey(Department, blank=True, null=True, on_delete=models.SET_NULL)
    is_active = models.BooleanField(default=True)
    is_manager = models.BooleanField(default=False)

    class Meta:
        ordering = ('is_active', 'last_name',)

    def __str__(self):
        return "{}".format(self.first_name + ' ' + self.last_name)

是的,这是一种可以接受的模式。这称为递归关系或自引用外键,是现实世界应用程序中非常常见的用例


这里是

是的,这是一个可接受的模式。这称为递归关系或自引用外键,是现实世界应用程序中非常常见的用例

这是非常好的

我建议您指定相关的_名称,以使代码更加明确:

manager = models.ForeignKey(..., related_name="managed_employees")
然后你可以做一些类似的事情:

bob.managed_employees.all()
另外,关于模型,有两件事我想改变,不是你的问题,而是:

1.manager_电子邮件字段是冗余的。我会移除它。例如,您已经在tom.manager.email_地址中获得了该信息

2.有许多字段我只需重命名为name即可。例如:

class OrganizationTitle(models.Model):
    def __str__(self):
        return u"{}".format(self.name)

    name = models.CharField(max_length=150, unique=True)
无需称其为组织名称。这与first_name字段一致,而不是employee_first_name。

这很好

我建议您指定相关的_名称,以使代码更加明确:

manager = models.ForeignKey(..., related_name="managed_employees")
然后你可以做一些类似的事情:

bob.managed_employees.all()
另外,关于模型,有两件事我想改变,不是你的问题,而是:

1.manager_电子邮件字段是冗余的。我会移除它。例如,您已经在tom.manager.email_地址中获得了该信息

2.有许多字段我只需重命名为name即可。例如:

class OrganizationTitle(models.Model):
    def __str__(self):
        return u"{}".format(self.name)

    name = models.CharField(max_length=150, unique=True)

无需称其为组织名称。这与“姓名”字段一致,而不是“员工姓名”。

非常感谢您抽出时间来帮助我们。非常感谢您抽出时间来帮助我们。太好了。非常感谢您对最佳实践的详细介绍。太好了。非常感谢您对最佳实践的详细介绍。