Внешнее соединение "многие ко многим" SQLAlchemy с фильтром

Я работаю с учебником 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))

Не могли бы вы включить образец того, что вы надеетесь получить, или того, что вы делаете в данный момент, чтобы это получить?

Ilja Everilä 02.05.2018 08:23

Возможно несколько связанных: stackoverflow.com/questions/28678443/…

Ilja Everilä 02.05.2018 08:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
343
0

Другие вопросы по теме