В приложении Flask, которое использует SQLAlchemy, у меня есть таблицы для пользователей и ресурсов. Пользователи принадлежат к нулю нескольким группам, и доступ к каждому активу разрешен к нулю нескольким из этих групп. Эти отношения моделируются с помощью ассоциативных таблиц (структура basi c показана ниже). Я могу запросить базу данных, и таблицы сопоставлений работают так, как задумано.
Часть, в которой я борюсь, заключается в том, чтобы, учитывая пользователя, получить ресурсы, к которым этому пользователю разрешен доступ. Я понимаю, что мне нужно вступать в группы.
В SQL следующее утверждение дает нужный мне результат:
select * from user as u
join association_user_group as aug on u.id == aug.user_id
join association_asset_group as aag on aag.group_id = aug.group_id
where username='some_name';
Однако я не могу понять, как перевести это в Flask -SQLAlchemy, используя его преимущества (которые мне нравятся во многих контекстах).
Для простоты, давайте предположим, что рассматриваемый пользователь User.query.first()
(в моем коде у меня есть ссылка на этот объект).
базисное c определение базы данных выглядит следующим образом:
association_user_group = db.Table(
'association_user_group',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('group_id', db.Integer, db.ForeignKey('group.id'))
)
association_asset_group = db.Table(
'association_asset_group',
db.Column('asset_id', db.Integer, db.ForeignKey('asset.id')),
db.Column('group_id', db.Integer, db.ForeignKey('group.id'))
)
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
...
class Asset(db.Model):
__tablename__ = 'asset'
id = db.Column(db.Integer, primary_key=True)
...
class Group(db.Model):
__tablename__ = 'group'
id = db.Column(db.Integer, primary_key=True)
...
users = db.relationship(
'User',
secondary=association_user_group,
backref=db.backref('groups', lazy='dynamic'))
asset = db.relationship(
'Asset',
secondary=association_asset_group,
backref=db.backref('groups', lazy='dynamic'))
Обновление : Тем временем работает следующий вид, но он не использует определенные db.relationship
s на уроках, что кажется позором:
db.session.query(association_asset_group) \
.join(association_user_group,
association_user_group.c.group_id
== association_asset_group.c.group_id) \
.filter(association_user_group.c.user_id == u.id)