#sqlalchemy
#sqlalchemy
Вопрос:
У меня есть несколько отношений «многие ко многим», все они относятся к одному User
классу, и я хочу извлечь различные Users
по некоторым заданным критериям во многих таблицах..
Здесь a User
может быть членом нескольких Clubs
или Restaurants
, и у каждого Club
или Restaurant
может быть много Users
одинаковых…
club_user_table = Table('club_user_ass', db.Model.metadata,
Column('club_id', db.Integer, db.ForeignKey('club.id')),
Column('user_id', db.Integer, db.ForeignKey('user.id'))
)
rest_user_table = Table('rest_user_ass', db.Model.metadata,
Column('rest_id', db.Integer, db.ForeignKey('restaurant.id')),
Column('user_id', db.Integer, db.ForeignKey('user.id'))
)
class User(db.model):
...
clubs = db.relationship('Club', back_populates='club_card_holders', secondary=club_user_table)
restaurants = db.relationship('Restaurant', back_populates='rest_card_holders', secondary=rest_user_table)
class Club(db.model):
...
club_card_holders = db.relationship('User', back_populates='clubs', secondary=club_user_table)
class Restaurant(db.model):
...
rest_card_holders = db.relationship('User', back_populates='restaurants', secondary=rest_user_table)
Предположим, мне нужен список пользователей, если название клуба или ресторана «FooBar», тогда я могу выполнить два отдельных запроса:
L1 = User.query.join(Club.club_card_holders).filter(Club.name == "FooBar").all()
L2 = User.query.join(Restaurant.rest_card_holders).filter(Restaurant.name == "FooBar").all()
Итак, L1
и L2
— это списки пользователей, но чего я действительно хочу, так это отдельного (неповторяющихся элементов) объединения L1 и L2 в чистом формате sqlalchemy.
Нужно ли мне использовать подзапросы или это можно сделать с помощью другого соединения?
Ответ №1:
Ошеломляюще простое решение:
L1 = User.query.join(Club.club_card_holders).filter(Club.name == "FooBar")
L2 = User.query.join(Restaurant.rest_card_holders).filter(Restaurant.name == "FooBar")
L3 = L1.union(L2)