RDBMS 多对多关系 Django

问题描述 投票:0回答:1

我正在开发一个 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)

希望获得一些关于如何实现这个看似复杂的设计的指导。

django django-models rdbms
1个回答
0
投票

使用第三种模型:

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
的详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.