代码之家  ›  专栏  ›  技术社区  ›  babsdoc

RDBMS多对多关系Django

  •  1
  • babsdoc  · 技术社区  · 1 年前

    我正在做一个django项目,很难将我的数据模型关联起来。

    我希望实现以下目标,我有三个模型:员工、项目和项目角色。

    我希望以这样一种方式实现模型,即User1在项目1中具有Lead(ProjectRole),但在项目2中具有Member(ProjectRole)。而User2在项目2中具有Lead(ProjectRole),但在项目1中具有Member(ProjectRole)。也许下表能说明问题。

    Employee         Project          ProjectRole
    User1            project1         Lead
    User1            project2         Member
    User2            project1         Member
    User2            project2         Lead
    

    我完全感到困惑,希望有人简单地解释如何在模型中定义关系。

    到目前为止,我的模型.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)
    

    我很想得到一些关于如何实现这个看似复杂的设计的指导。

    1 回复  |  直到 1 年前
        1
  •  1
  •   willeM_ Van Onsem    1 年前

    使用第三种模型:

    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 s代表 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() 以获得 工作 因此还包含有关的详细信息的记录 .role 为此 .employee .

    推荐文章