SQLAlchemy - доступ к атрибуту из двунаправленного прокси-сервера ассоциации - PullRequest
0 голосов
/ 21 октября 2019

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

Они используются для выражения отношения многие-ко-многим между классами Account и User, управляемыми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, чтобы определить, какую роль играет пользователь каждый раз, когда он пытается получить доступ к учетной записи, потому что это анти-шаблон для отношений с базой данных?

1 Ответ

0 голосов
/ 22 октября 2019

Пара вариантов, некоторые из которых описаны в этом посте .

Во-первых, вы можете напрямую запросить таблицу объектов ассоциации;

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

Или, если у вас уже есть доступ к экземпляру User, вы можете найтиучетная запись, которую вы ищете, из объекта users и доступа к роли;

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