Подтвердить что ты не робот

SQLAlchemy, как фильтровать по детям от многих до многих

Я просил проблему, которую я имел в SQLAlchemy, и нашел решение во время записи. Я отправляю его в любом случае на всякий случай, если это кому-то помогает:)

Скажем, у меня есть много-много отношений, которые, кажется, работают (по крайней мере, я могу получить детей). Три таблицы: сообщения, теги и post_tags.

import sqlalchemy as alc

class Tag(Base):
    __tablename__ = 'tags'

    id = alc.Column(alc.Integer, primary_key=True)
    name = alc.Column(alc.String)
    accepted = alc.Column(alc.Integer)

    posts = relationship('Post', secondary=post_tags)



class Post(Base):

    __tablename__ = 'posts'

    id = alc.Column(alc.Integer, primary_key=True)
    text = alc.Column(alc.String)
    date_out = alc.Column(alc.Date)

    tags = relationship('Mistake_Code', secondary=post_tags)

# relational table
post_tags = alc.Table('check_point_mistakes',
                       Base.metadata,
                       alc.Column('post_id', alc.Integer,ForeignKey('posts.id')),
                       alc.Column('tag_id', alc.Integer, alc.ForeignKey('tags.id')))

Теперь моя проблема в том, что я хочу сначала фильтровать date_out в Post. Я могу сделать это так:

# assume start_date and end_date

query = (
            session.query(Post)
                   .filter(Post.date_out.between(start_date, end_date))
 )

Но как фильтровать по тегам в одно и то же время?

4b9b3361

Ответ 1

query = (
    session.query(Post)
           .join(Post.tags)     # It necessary to join the "children" of Post
           .filter(Post.date_out.between(start_date, end_date))
           # here comes the magic: 
           # you can filter with Tag, even though it was not directly joined)
           .filter(Tag.accepted == 1)
)

Отказ от ответственности: это уменьшенный пример моего фактического кода, я, возможно, допустил ошибку при упрощении.

Я надеюсь, что это поможет кому-то.