SQLAlchemy Many-Many с условием на одну таблицу - PullRequest
0 голосов
/ 17 января 2020

В приложении Flask у меня есть таблицы

class Event(db.Model):
    __tablename__ = 'event'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    event_name = db.Column(db.String(length=128), nullable=False)
    event_to_meta = db.relationship('EventMeta', secondary='event_meta_tbl', lazy='subquery',
                                    backref=db.backref('meta_events', lazy=True))

class EventMeta(db.Model):
    __tablename__ = 'event_meta'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    meta_key = db.Column(db.String(length=128), nullable=False)
    meta_value = db.Column(db.String(length=128), nullable=True)
    events = db.relationship(Event, secondary='event_meta_tbl', backref='event_to_metas')

event_meta_tbl = db.Table('event_meta_tbl', db.metadata,
                          db.Column('event_id', db.Integer, db.ForeignKey('event.id',
                                    ondelete='CASCADE'), primary_key=True),
                          db.Column('meta_id', db.Integer, db.ForeignKey('event_meta.id',
                                    ondelete='CASCADE'), primary_key=True),
                          extend_existing=True)

Проблема, которая несколько отличает это, заключается в том, что запросы хотят выбирать События со значениями из таблицы EventMeta, где указан c meta_key указано.

Я пробовал широкий спектр запросов без успеха по строкам:

audience_filter=session.query(EventMeta).filter(EventMeta.meta_key=='audience').\
                filter(EventMeta.meta_value.in_(audiences)).subquery()
events = session.query(Event).join(audience_filter).all()

все из которых возвращают пустой результат. Это должно быть довольно просто и понятно. Буду признателен за руководство, чтобы вывести меня на правильный путь.

...