2017-10-19 14 views
0

ユーザーが多数のグループに所属し、各グループに複数のロールを持つユーザーグループロールテーブル構造と統合しようとしています。SQLAlchemy多対多のユーザー、グループ、ロール

私はしかし、それは複数の役割を許可しない、これに類似した質問が見つかりました:Many-to-many declarative SQLAlchemy definition for users, groups, and roles

私は次の表の構造を有し、方法の次の並べ替えでの役割にアクセスできるようにしたいと思います:user.groups[0].roles

class Role(Base): 
    __tablename__ = 'roles' 
    id = Column(Integer, primary_key=True, autoincrement=True) 
    name = Column(Unicode(16), unique=True) 

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True, autoincrement=True) 
    name = Column(Unicode(16), unique=True) 

class Group(Base): 
    __tablename__ = 'groups' 
    id = Column(Integer, primary_key=True, autoincrement=True) 
    name = Column(Unicode(16), unique=True) 

class UserGroup(Base): 
    __tablename__ = 'user_group_role' 
    id = Column(Integer, primary_key=True, autoincrement=True) 
    user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), nullable=False) 
    group_id = Column(Integer, ForeignKey('groups.id', ondelete='CASCADE'), nullable=False) 
    role_id = Column(Integer, ForeignKey('roles.id', ondelete='CASCADE'), nullable=False) 

答えて

0

これがTurbogears「デフォルトのフルスタックのクイックスタートの例です。

from sqlalchemy import Table, ForeignKey, Column 
from sqlalchemy.types import Unicode, Integer, DateTime 
from sqlalchemy.orm import relation, synonym 

from .model import DeclarativeBase, metadata, DBSession 


# This is the association table for the many-to-many relationship between 
# groups and permissions. 
group_permission_table = Table('tg_group_permission', metadata, 
          Column('group_id', Integer, 
            ForeignKey('tg_group.group_id', 
              onupdate="CASCADE", 
              ondelete="CASCADE"), 
            primary_key=True), 
          Column('permission_id', Integer, 
            ForeignKey('tg_permission.permission_id', 
              onupdate="CASCADE", 
              ondelete="CASCADE"), 
            primary_key=True)) 


# This is the association table for the many-to-many relationship between 
# groups and members - this is, the memberships. 
user_group_table = Table('tg_user_group', metadata, 
        Column('user_id', Integer, 
          ForeignKey('tg_user.user_id', 
             onupdate="CASCADE", 
             ondelete="CASCADE"), 
          primary_key=True), 
        Column('group_id', Integer, 
          ForeignKey('tg_group.group_id', 
             onupdate="CASCADE", 
             ondelete="CASCADE"), 
          primary_key=True)) 


class Group(DeclarativeBase): 
    __tablename__ = 'tg_group' 

    group_id = Column(Integer, autoincrement=True, primary_key=True) 
    group_name = Column(Unicode(16), unique=True, nullable=False) 
    users = relation('User', secondary=user_group_table, backref='groups') 

class User(DeclarativeBase): 
    __tablename__ = 'tg_user' 

    user_id = Column(Integer, autoincrement=True, primary_key=True) 
    user_name = Column(Unicode(16), unique=True, nullable=False) 
    email_address = Column(Unicode(255), unique=True, nullable=False) 
    display_name = Column(Unicode(255)) 


class Permission(DeclarativeBase): 
    __tablename__ = 'tg_permission' 

    permission_id = Column(Integer, autoincrement=True, primary_key=True) 
    permission_name = Column(Unicode(63), unique=True, nullable=False) 
    description = Column(Unicode(255)) 

    groups = relation(Group, secondary=group_permission_table, 
        backref='permissions') 
+1

私はこのタイプの構造が好きですが、私は上記の構造を持つ既存のテーブルに統合する必要があります。 – rachekalmir

関連する問題