Присоединение / добавление нескольких подзапросов типа «многие ко многим» с одинаковым типом результата - PullRequest
0 голосов
/ 26 марта 2019

У меня есть несколько отношений многие ко многим, все они связаны с одним User классом, и я хочу выделить Users по некоторым заданным критериям, по многим таблицам.

Здесь 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 Ответ

0 голосов
/ 26 марта 2019

Смущающе простое решение:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...