我很困惑如何获取用户拥有的所有权限。 我有以下4个模型。(用户,角色,role_permission(作为关联表),权限)
class User(db.Model , UserMixin):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True , autoincrement=True)
name = db.Column(db.String(60), nullable=False)
role_id = db.Column(db.Integer, db.ForeignKey('role.id') , nullable = False )
def __repr__(self):
return f"User('{self.name}',{self.email}', '{self.company}' , '{self.country}' , '{self.password}' , '{self.role_id}')"
class Role(db.Model):
__tablename__ = 'role'
user = db.relationship('User' ,uselist=False)
id = db.Column(db.Integer, primary_key=True ,autoincrement=True)
role_name = db.Column(db.String(100), nullable=False , unique=True)
_add_permission = db.relationship('Permission' , secondary=lambda:role_permission , backref= db.backref('permission', lazy = 'dynamic') , lazy = 'dynamic' )
def __repr__(self):
return f"ROle('{self.id}',{self.role_name}')"
role_permission = db.Table('Role_Permission',
db.Column('id',db.Integer, primary_key=True , autoincrement=True),
db.Column('roleName' , db.Integer, db.ForeignKey('role.id') , nullable = False),
db.Column('permissionName' , db.Integer, db.ForeignKey('permission.id') , nullable = False)
)
class Permission(db.Model):
__tablename__ = 'permission'
id = db.Column(db.Integer, primary_key=True , autoincrement=True)
permission_name = db.Column(db.String(100), nullable=False , unique=True)
_add_role = db.relationship('Role' , secondary=lambda:role_permission , backref= db.backref('role', lazy = 'dynamic') , lazy = 'dynamic')
def __repr__(self):
return f"Permission('{self.permission_name}')"
假设它是我的用户 user = User(....,role-id = 1)//他是管理员
Role:
id role_name
1 admin
2 guest
role_permision
role_id permission_id
1 1 ( he can add)
1 2 ( he can read)
permisison
1 ----> add
2----->read
3----->view
您可以看到user1是admin,作为admin他可以添加和读取。 如何使用sqlalchemy获得此结果? 如何知道哪个用户具有哪个角色和哪些权限。
由于我是该领域的新手,并且希望学习和探索您的帮助,我们深感感谢。 预先感谢
答案 0 :(得分:1)
好的,假设您有一个用户ID。您可以采用以Python为重点的方式或以SQL为重点的方式。
在python中,您需要添加relationship
属性,以便user
可以访问role
和role_id
。在此示例中,将role = db.relationship('Role', backref='users')
添加到User
模型中。其次,为什么将这些关系称为_add_*
?我会删除它。
要获取User
对象,可以使用user = User.query.get(1)
,然后使用role = user.role
获取Role
的实例。现在,permissions = role.permissions
,您就完成了。这很容易,但是需要一些查询-您只是没有注意到它。
user = User.query.get(1)
role = user.role
permissions = role.permissions
在SQL 中,您还可以创建一个查询来一次性获得所有查询:
SELECT permission_id
FROM role_permission
-- you can even remove this line and join `user and role_permission` directly
JOIN role ON role.id = role_id
JOIN user ON user.role_id = role.id
WHERE user.id = 1;
SQLAlchemy中的哪个会成为
permission_ids = db.session\
.query(Permission.id)\
.join(Role)\
.join(User)\
.filter(User.id == 1)\
.all()
在这里,由于您在模型定义中放置了backref
和secondary
属性,SQLAlchemy已经知道如何连接表!