我正在开发一个 Django 项目,在关联我的数据模型时遇到困难。
我希望实现以下目标,我有 3 个模型 Employee、Project 和 ProjectRole。
我希望以这样的方式实现模型:用户 1 在项目 1 中拥有领导 (ProjectRole),但在项目 2 中拥有成员 (ProjectRole)。虽然用户 2 在项目 2 中拥有领导 (ProjectRole),但在项目 1 中拥有成员 (ProjectRole)。也许下面的表格可以让你明白。
Employee Project ProjectRole
User1 project1 Lead
User1 project2 Member
User2 project1 Member
User2 project2 Lead
我完全困惑,希望有人用简单的术语解释如何在模型中定义关系。
到目前为止,我的 models.py 中有以下内容,但我确信它是不正确的,因为它没有按预期工作。
class ProjectRole(models.Model):
rolename = models.CharField(max_length=10)
class Project(models.Model):
projname = models.CharField(max_length=10)
projrole = models.ManyToManyField(ProjectRole)
class Employee(models.Model):
empname = models.CharField(max_length=10)
projrole = models.ManyToManyField(ProjectRole)
希望获得一些关于如何实现这个看似复杂的设计的指导。
使用第三种模型:
class ProjectRole(models.Model):
rolename = models.CharField(max_length=10)
class Project(models.Model):
projname = models.CharField(max_length=10)
class Employee(models.Model):
empname = models.CharField(max_length=10)
class Employment(models.Model):
employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
project = models.ForeignKey(Project, on_delete=models.CASCADE)
role = models.ForeignKey(ProjectRole, on_delete=models.CASCADE)
第三个模型因此将包含三元组
employee
、project
和 role
。
如果您想轻松获得
Employee
的 Project
,通过查看 Employement
模型,我们可以使用以下方法跨越经过 ManyToManyField
模型的 Employment
:
class ProjectRole(models.Model):
rolename = models.CharField(max_length=10)
class Project(models.Model):
projname = models.CharField(max_length=10)
employees = models.ManyToManyField(
'Employee', through='Employment', related_name='projects'
)
roles = models.ManyToManyField(
ProjectRoles, through='Employment', related_name='projects'
)
class Employee(models.Model):
empname = models.CharField(max_length=10)
roles = models.ManyToManyField(
ProjectRole, through='Employment', related_name='employees'
)
class Employment(models.Model):
employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
project = models.ForeignKey(Project, on_delete=models.CASCADE)
role = models.ForeignKey(ProjectRole, on_delete=models.CASCADE)
但如果您需要完整的详细信息,您可以使用
my_project.employment_set.all()
来获取 Employment
记录,从而包含有关 .role
的 .employee
的详细信息。