Python SQLAlchemy-从双向关联代理访问属性
在炼金术中,我有三个模型定义如下:Python SQLAlchemy-从双向关联代理访问属性,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,在炼金术中,我有三个模型定义如下: class Account(db.Model): __tablename__ = 'accounts' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64))
class Account(db.Model):
__tablename__ = 'accounts'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
users = association_proxy('user_accounts', 'user')
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64))
accounts = association_proxy('user_accounts', 'account')
class Permission(db.Model):
__tablename__ = 'permissions'
account_id = db.Column(db.Integer, db.ForeignKey('accounts.id'), primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
role = db.Column(db.Integer)
account = db.relationship("Account", backref=backref('user_accounts
user = db.relationship("User", backref=backref('user_accounts'))
它们用于表示帐户
和用户
类之间的多对多关系,由权限
控制
目前,我可以做以下工作:
# create initial records
a = Account()
u = User()
p = Permission()
p.account = a
p.user = u
db.session.add_all([a, u, p])
db.session.commit()
# get the list of accounts associated with a user
u.accounts
[<Account 1>]
# get the list of users associated with an account (same as above, just reverse)
a.users
[<User 1>]
#创建初始记录
a=账户()
u=用户()
p=权限()
p、 帐户=a
p、 用户=u
db.session.add_all([a,u,p])
db.session.commit()
#获取与用户关联的帐户列表
u、 帐目
[]
#获取与帐户关联的用户列表(同上,仅相反)
a、 使用者
[]
但是,我无法获得用户在特定帐户中的确切角色
基本上,我希望能够做到这一点:
a.users[0]。角色
。。。要了解此用户在特定帐户a
上的角色,请执行以下操作。如果同一行针对不同的帐户运行,称为a2
,则我希望获得不同的角色(调用它的用户对帐户a2
而不是a1
具有的任何角色)
这甚至可以通过关系实现吗?或者,我应该循环查看权限
,查找用户每次尝试访问帐户时所扮演的角色,因为这是数据库关系的反模式吗?有几个选项,其中一些在中概述
一是可以直接查询关联对象表
permissions=Permission.query.filter\u by(user\u id==user\u id)。filter\u by(account\u id==account\u id)。one()
或者,如果您已经有权访问aUser
实例,则可以从users对象中找到您要查找的帐户并访问角色
account = next((aco for aco in user.accounts if aco.id == account_id), None)
if account:
role = account.role