Django中通过3-way Legacy Junction表的多对多关系

时间:2017-05-19 21:13:57

标签: python django django-models

使用遗留数据库,项目之间的多对多关系,项目中的人员以及他们在该项目中的角色通过三向联结表来表示,如下所示:

data relationship

如何用Django模型表示这些数据?

我正在尝试编写一个模型,其中project.manager将返回与person manager角色配对的project_id个实例列表。到目前为止,我最接近的是通过models.ManyToManyField中的两个不同字段使用Rolepersonproject,但这只会给我与该项目相关的角色和人员,而不是那些人扮演的角色。我该怎么做?这是自定义管理器,ManyToManyField,模型方法还是自定义SQL的工作?

manage.py inspectdb给了我这样的模型类来使用:

class Project(models.Model):
    project_id = models.AutoField(db_column='project_id', primary_key=True)

class Role(models.Model):
    role_id = models.AutoField(db_column='role_id', primary_key=True)

class Person(models.Model):
    person_id = models.AutoField(db_column='person_id', primary_key=True)

class Rolepersonproject(models.Model):
    project_id = models.ForeignKey(Project, models.DO_NOTHING, db_column='project_id')
    role_id = models.ForeignKey(Role, models.DO_NOTHING, db_column='role_id')
    person_id = models.ForeignKey(Person, models.DO_NOTHING, db_column='person_id')

1 个答案:

答案 0 :(得分:0)

使用inspectdb为您提供的模型,在related_name='rolepersonprojects'中为每个外键添加Rolepersonproject之后,您可以在Project模型上添加一个属性,如下所示:< / p>

class Project(models.Model):
    ...
    @property
    def manager(self):
        return self.rolepersonprojects.filter(role_id_id={{ id of manager Role }}).values_list('person_id', flat=True)
相关问题