【问题标题】:Can't figure out how to link multiple nesting many to many relationships无法弄清楚如何链接多个嵌套的多对多关系
【发布时间】:2019-08-09 00:24:46
【问题描述】:

我正在设置一个用户身份验证模块来指定三个角色:'r'、'w'、'x',但是我不知道如何链接网站的所有子组件。该网站有五个层次: 1- 多个组织 2- 每个组织有多个项目 3- 每个项目有多个模块。用户权限应与组织项目的模块相关联。

这是使用烧瓶 sqlalchmey 和烧瓶迁移。我已经阅读了烧瓶 sqlalchemy 和 sqlalchemy.com 文档,发现关联表可能是解决问题的方法。但我被困在这里,

class Hospital(db.Model):

    __tablename__ = 'hospitals'
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(), unique=True)


class Project(db.Model):

    __tablename__ = 'projects'
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(), unique=True)


class Module(db.Model):

    __tablename__ = 'modules'
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(), unique=True)


class HospitalProject(db.Model):

    __tablename__ = 'hospital_projects'
    id = db.Column(db.Integer(), primary_key=True)
    hospital_id = db.Column(db.Integer, db.ForeignKey('hospitals.id'), primary_key=True)
    project_id = db.Column(db.Integer, db.ForeignKey('projects.id'), primary_key=True)
    hospital = db.relationship('Hospital', backref='projects')
    project = db.relationship('Project', backref='hospitals')


class HospitalProjectModules(db.Model):

    __tablename__ = 'hospital_project_modules'
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(), unique=True)
    hospital_project_id = db.Column(db.Integer, db.ForeignKey('hospital_projects.id'), primary_key=True)
    module_id = db.Column(db.Integer, db.ForeignKey('modules.id'), primary_key=True)
    hospital_project = db.relationship('HospitalProject', backref='modules')
    module = db.relationship('Module', backref='hospital_projects')


class Role(db.Model):

    __tablename__ = 'roles'
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(), unique=True)


class HospitalProjectModulesUserRoles(db.Model):

    __tablename__ = 'hospital_project_modules_user_roles'
    id = db.Column(db.Integer(), primary_key=True)
    hospital_project_module_id = db.Column(db.Integer, db.ForeignKey('hospital_project_modules.id'), primary_key=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'), primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
    hospital_project_module = db.relationship('HospitalProjectModules', backref='User_Roles')
    user = db.relationship('User', backref='hospital_project_module_roles')
    role = db.relationship('Role', backref='hospital_project_module_users')

我遇到了这个错误。我知道这是因为 hospital_projects 没有唯一标识符,但我不知道如何解决它。

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.InvalidForeignKey) 没有匹配给定键的唯一约束 引用表“hospital_projects”

[SQL:
CREATE TABLE hospital_project_modules (
        id INTEGER NOT NULL,
        name VARCHAR,
        hospital_project_id INTEGER NOT NULL,
        module_id INTEGER NOT NULL,
        PRIMARY KEY (id, hospital_project_id, module_id),
        FOREIGN KEY(hospital_project_id) REFERENCES hospital_projects (id),
        FOREIGN KEY(module_id) REFERENCES modules (id),
        UNIQUE (name)

app/models.py61:51
LFUTF-8Pythongit+
DAMPublishGitHubGit (8)2 updates

【问题讨论】:

    标签: python flask flask-sqlalchemy


    【解决方案1】:

    您的所有外键引用列都有 PrimaryKey 约束。 删除这些约束,因为它们是不必要的,因为您已将每个表设置为将其自己的 'id' 字段作为主键。 基本上,在您上面的每个表的代码中,应该只有一个 PrimaryKey 列。

    例如 hospital_project_id = db.Column(db.Integer, db.ForeignKey('hospital_projects.id'), primary_key=True) 变成 hospital_project_id = db.Column(db.Integer, db.ForeignKey('hospital_projects.id'))

    【讨论】:

      猜你喜欢
      • 2014-09-27
      • 1970-01-01
      • 2019-04-09
      • 2013-04-03
      • 1970-01-01
      • 2014-08-14
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多