簡體   English   中英

無法弄清楚如何鏈接多個嵌套的多對多關系

[英]Can't figure out how to link multiple nesting many to many relationships

我正在設置用戶身份驗證模塊以指定三個角色:“r”、“w”、“x”,但是我不知道如何鏈接網站的所有子組件。 該網站有五個級別: 1- 多個組織 2- 每個組織有多個項目 3- 每個項目有多個模塊。 用戶權限應鏈接到組織項目的模塊。

這是使用flask sqlalchmey 和flask-migrate。 我已經通讀了flask 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

您對所有外鍵引用列都有 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'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM