Я работаю с учебником Flask-SQLAlchemy от PrettyPrinted и пытаюсь выяснить, как добиться определенного поведения при запросе среды таблиц "многие ко многим".
Я включу запрос, который я пытался, и код для настройки SQLAlchemy ORM ниже. Основываясь на учебнике (который не входит в соединения или внешние соединения), есть две основные таблицы, таблица каналов и таблица пользователей, а также таблица отношений, называемая «подпрограммы». Таким образом, каждый пользователь может быть «подписан» на канал, или на несколько каналов, или ни на один.
Я пытаюсь понять, как выполнить запрос, чтобы получить список всех строк в канале, но с фильтром, или иметь вычисляемый столбец или дополнительный столбец, чтобы указать только те, на которые подписан конкретный идентификатор пользователя. ' к. Таким образом, все будет возвращено, только дополнительный столбец (или не пустые данные в столбце) для тех, на которые подписан выбранный пользователь.
Вот запрос, который я пытался (пробовал несколько других, но с еще меньшим успехом):
chan_query = Channel.query.outerjoin(User, User.user_id==1).all()
Проблема в том, что это возвращает не только все строки в канале (что я действительно хочу), но и когда я погружаюсь в каждую строку вместо того, чтобы просто иметь значение NULL, а не NULL, или что-либо, что указывало бы только на выбранный идентификатор пользователя. будучи подписанным, в нем перечислены ВСЕ пользователи, которые подписаны на каждый канал. Единственный способ, которым я смог имитировать то, что я пытаюсь сделать, - это два запроса - один для всех каналов, один для всех каналов, на которые подписан пользователь, а затем использовать понимание для создания того, что я ' м в надежде получить с помощью одного запроса. Не очень питоническая или хорошая практика управления данными.
Может ли кто-нибудь указать мне, что я делаю не так, и как научиться это исправлять? Большое спасибо!
Ниже приведен код используемых таблиц ORM:
subs = db.Table('subs',
db.Column('user_id', db.Integer, db.ForeignKey('user.user_id')),
db.Column('channel_id', db.Integer, db.ForeignKey('channel.channel_id'))
)
class User(db.Model):
user_id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20))
subscriptions = db.relationship('Channel', secondary=subs, backref=db.backref('subscribers', lazy='dynamic'))
class Channel(db.Model):
channel_id = db.Column(db.Integer, primary_key=True)
channel_name = db.Column(db.String(20))
Возможно несколько связанных: stackoverflow.com/questions/28678443/…
Не могли бы вы включить образец того, что вы надеетесь получить, или того, что вы делаете в данный момент, чтобы это получить?