2012-11-22 19 views
12

मैं स्क्लेक्लेमी में एक समस्या के लिए पूछ रहा था और लिखते समय समाधान मिला। मैं वैसे भी पोस्ट करता हूं अगर यह किसी की मदद करता है :)SQLAlchemy कई लोगों द्वारा कई लोगों को फ़िल्टर करने के लिए

मान लें कि मेरे पास काम करने के लिए कई रिश्ते हैं (कम से कम मैं बच्चों को ला सकता हूं) तीन टेबल: पोस्ट, टैग और पोस्ट_टैग।

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) 
) 

अस्वीकरण: यह मेरे वास्तविक कोड का एक वीर्य कम उदाहरण है, मैंने सरलीकरण करते समय गलती की हो सकती है।

मुझे उम्मीद है कि यह किसी की मदद करेगा।

संबंधित मुद्दे