gpt4 book ai didi

python - django 应用程序中模型的自连接是否是可接受的模式?

转载 作者:太空宇宙 更新时间:2023-11-04 09:49:10 25 4
gpt4 key购买 nike

如果这个问题过于主观,我们深表歉意。

如果您打算关闭此问题:请评论并建议更合适的发帖位置。

我是 django 和 python 的 super 新手,我正在构建一个测试应用程序来跟踪员工和他们的经理是谁。

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

为实现这一点,我在 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)

最佳答案

这很好。

我建议您指定 related_name 以使您的代码更明确:

manager = models.ForeignKey(..., related_name="managed_employees")

然后你可以做类似的事情:

bob.managed_employees.all()

另外,我要更改两件事(不是您的问题,但仍然与模型有关):

1. manager_email 字段是多余的。我会删除它。例如,您已经在 tom.manager.email_address 中获得了该信息。

2.有很多字段我可以简单地重命名为name。例如:

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

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

无需将其命名为 organization_title_name。这与 first_name 字段一致(不是 employee_first_name)。

关于python - django 应用程序中模型的自连接是否是可接受的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48553692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com