我正在做一个Django项目,在关联我的数据模型时遇到了困难.

我希望实现以下目标,我有3个模型员工,项目和项目角色.

我希望以这样一种方式实现模型:用户1在项目1中拥有Lead(ProjectRole),但在项目2中拥有成员(ProjectRole).而用户2将在项目2中具有Lead(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)

因此,第三个模型将包含employeeprojectrole的三元组.

如果您想轻松获得ProjectEmployee,通过查看Employement型号,我们可以通过以下方式跨越Employment型号的ManyToManyField:

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条记录,这些记录也包含关于这.employee.role的详细信息.

Django相关问答推荐

Django ORM多表一对多关系问题

在Django的个人页面中的问题

当前路径 **/POST 与其中任何一个都不匹配

根据当前对象中的多对多字段过滤对象

Django 获取用户创建的对象,这些用户属于用户列表

如何使用具有某些权限的 Django 组的转储数据和加载数据?

Pymongo:搜索文档时忽略空输入值

Django - 是否可以为查询集预取单个字段的多个过滤器?

如何将 ManyToManyField 与另一个 ManyToManyField 进行比较

InvalidBasesError:无法解析 [] 的基础

用于测试文件下载的 Django 单元测试

如何在 django 模板中将名称反转为绝对 url?

在 Django 中提供大文件(高负载)

Django聚合:仅求和返回值?

django - pisa:将图像添加到 PDF 输出

Django 1.9 中 django.db.models.loading.get_model() 的类似功能是什么?

Django - 如何从模型实例中获取管理员 URL

django - 如何使翻译工作?

django:TypeError:'tuple'对象不可调用

django 静态文件版本控制