2017-11-25 3 views
0

sqlalchemyで親と子レベルでフィルタリングされた自己参照関係を得るためにクエリを実行しようとしています。フラスコ - sqlalchemy - 自己参照クエリ

category_country = Table('category_country', Base.metadata, 
    Column('category_id', Integer, ForeignKey('category.id'), primary_key=True), 
    Column('country_id', Integer, ForeignKey('country.id'), primary_key=True) 
) 

class Category(Base): 
    __tablename__ = "category" 
    id = Column(Integer, primary_key=True, autoincrement=True) 
    parent_id = Column(Integer, ForeignKey('category.id')) 
    subcategories = relationship("Category", backref=backref('parent', remote_side=id)) 
    countries = relationship(Country, secondary = category_country, backref='categories') 

class Country(Base): 
    __tablename__ = "country" 
    id = Column(Integer, primary_key=True) 

クエリ

category = s.query(Category).join(Category.countries).options(contains_eager(Category.countries)).filter(Country.id == 1).filter(Category.id == category_id).join(Category.countries, aliased=True).join(Category.subcategories, aliased=True).options(contains_eager(Category.countries)).filter(Country.id == 1).first() 

が、それは動作しません。私は国1の子供を見つける必要があり、その親はcategory_idであり、国も1

答えて

0

私の最初の読書であなたのモデルやコードを完全に入手することはできませんが、私はこれに取り組む方法は自己参照は次のようにサブクエリ()文に参加:私は、クエリのこれらの種類を簡素化することができ、パターンのこの種を見つけた

filter_by_country = (db.session.query(...) 
        .filter(...) 
        .subquery()) 

final_results = (db.session.query(...) 
       .join(filter_by_country, 
         db.and_(Category.id == filter_by_country.c.id, ..., ...)) 
       .options(...) 
       .filter(...) 
       .etc(...).first()) 

。お役に立てれば。