【问题标题】:Many-to-Many Relationships through 3-way Legacy Junction Table in Django通过 Django 中的 3-way Legacy Junction Table 建立多对多关系
【发布时间】:2017-10-20 02:48:10
【问题描述】:

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

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

我正在尝试编写一个模型,其中project.manager 将返回与project_idmanager 角色配对的person 实例列表。到目前为止,我得到的最接近的是通过Rolepersonproject 中的两个不同字段使用models.ManyToManyField,但这只会给我与该项目相关的角色和人员,而不是这些人扮演的角色。我该怎么做?这是自定义管理器、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')

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    使用 inspectdb 提供的模型,在将 related_name='rolepersonprojects' 添加到 Rolepersonproject 中的每个外键后,您可以将属性添加到 Project 模型中,如下所示:

    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)
    

    【讨论】:

    • 抱歉周末耽搁了。我现在就试试这个。谢谢!
    • 这很好用。虽然,我省略了values_list 以访问其他表中的所有字段。
    • 很高兴听到它有帮助!
    猜你喜欢
    • 2016-04-18
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 2021-03-19
    相关资源
    最近更新 更多