2017-10-19 78 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