2012-11-22 22 views
12

私はSQLAlchemyの問題を尋ねていました。私はそれを誰かに役立てるためにとにかく投稿します:)SQLAlchemy多くの人から多くの人へのフィルタリング方法

私はうまくいくと思われる(少なくとも私は子供をフェッチすることができます)3つのテーブル:投稿、タグ、および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で最初にフィルタしたいということです。私はこれのように得ることができます:

# assume start_date and end_date 

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

しかし、同時にタグでフィルタリングするには?

答えて

16
query = (
    session.query(Post) 
      .join(Post.tags)  # It's 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) 
) 

免責事項:これは私の実際のコードのベライエットを減らした例です。単純化している間に間違いを犯している可能性があります。

私はそれが誰かを助けてくれることを願っています。

関連する問題