Я работаю с учебником PrettyPrinted Flask-SQLAlchemy и пытаюсь выяснить, как получить определенное поведение при запросе табличной среды «многие ко многим».
Я включу запрос, который я пробовал, и код для настройки SQLAlchemy ORM ниже. Основываясь на руководстве (которое не входит в соединения или внешние соединения), существуют две основные таблицы, таблица каналов и пользователь, а также таблица отношений, называемая «подпрограммами». Таким образом, каждый пользователь может быть «подписан» на канал, или более одного, или ни одного.
Я пытаюсь выяснить, как сделать запрос, чтобы я мог получить список всех строк в канале, но отфильтровать их, или иметь вычисляемый столбец или дополнительный столбец, чтобы указать только те, которые имеют определенный идентификатор пользователя подписан на. Таким образом, будет возвращено все, только дополнительный столбец (или не пустые данные в столбце) для тех, на которые подписан выбранный пользователь.
Вот запрос, который я пробовал (пробовал несколько других, но с еще меньшей удачей):
chan_query = Channel.query.outerjoin(User, User.user_id==1).all()
Проблема в том, что это возвращает не только все строки в Channel (что я и хочу сделать), но когда я погружаюсь в каждую строку вместо того, чтобы просто иметь нулевое и не нулевое значение, или что-либо, что указывало бы только на выбранный идентификатор пользователя, на который подписано, перечисляет ВСЕХ пользователей, которые подписаны на каждый канал. Единственный способ, которым я смог эмулировать то, что я пытаюсь сделать, - это два запроса - один для всех каналов, один для всех каналов, на которые подписан пользователь, и затем использование понимания для построения того, что я ' м в надежде получить с помощью одного запроса. Не очень питонная или хорошая практика по управлению данными.
Может ли кто-нибудь указать мне, что я делаю неправильно и как это исправить? Большое вам спасибо!
Ниже приведен код используемых таблиц 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))