【问题标题】:SQLAlchemy - Accessing Attribute from Bi-Directional Association ProxySQLAlchemy - 从双向关联代理访问属性
【发布时间】:2019-10-22 06:58:34
【问题描述】:

在 Flask-SQLAlchemy 中,我定义了三个模型,如下所示:

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')) 

这些用于表达AccountUser 类之间的多对多关系,由Permission 控制。

目前,我可以执行以下操作:

# 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.users[0].role

... 以便能够找出此用户在特定帐户 a 上的角色。如果同一行针对不同的帐户运行,称为a2,我希望获得不同的角色(调用它的用户具有帐户a2 而不是a1 的任何角色)。

这甚至可以通过关系实现吗?或者,我应该直接遍历Permissions 以查找用户每次尝试访问帐户时的角色,因为这是数据库关系的反模式?

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    几个选项,其中一些在this post 中进行了概述。

    一种是可以直接查询关联对象表;

    permissions = Permission.query.filter_by(user_id == user_id).filter_by(account_id == account_id).one()

    或者,如果您已经有权访问 User 实例,则可以从用户对象中找到您所追求的帐户并访问该角色;

    account = next((aco for aco in user.accounts if aco.id == account_id), None)
    if account:
        role = account.role
    

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多