SqlAlchemy ORM查询返回子列表

时间:2018-02-05 11:34:33

标签: python sqlalchemy

我有1个父(父)表和2个子(儿子,女​​儿)表,其中有很多对很多的关系。所以我还为每个孩子准备了2个辅助表。

class Parent(db.Model):
 id=db.Column(db.Integer, nullable=False, autoincrement=True, primary_key=True)
 name = db.Column(db.String(45), nullable=False)

 sons= db.relationship('Son',
                       secondary=parent_has_son,
                       back_populates='parents')

 daughters = db.relationship('Daughter',
                           secondary=parent_has_daughter,
                           back_populates='parents')


Class Son(db.Model):
 id=db.Column(db.Integer, nullable=False, autoincrement=True, primary_key=True)
 name = db.Column(db.String(45), nullable=False)
 age = db.Column(db.Integer)
 son_other_col = .Column(db.String(45))

 parents =  db.relationship('Parent',
                           secondary=parent_has_son,
                               back_populates='sons')


Class Daughter(db.Model):
     id=db.Column(db.Integer, nullable=False, autoincrement=True, primary_key=True)
     name = db.Column(db.String(45), nullable=False)
     age = db.Column(db.Integer)
     daughter_other_col1 = .Column(db.String(45))
     daughter_other_col2 = .Column(db.String(45))

     parents =  db.relationship('Parent',
                               secondary=parent_has_daughter,
                               back_populates='daughters')

parent_has_son = db.Table('parent_has_son ', db.metadata,
                                db.Column('parent_id', db.Integer, ForeignKey('Parent.id')),
                                db.Column('son_id', db.Integer, ForeignKey('Son.id')))

parent_has_daughter = db.Table('parent_has_daughter ', db.metadata,
                                    db.Column('parent_id', db.Integer, ForeignKey('Parent.id')),
                                    db.Column('daughter_id', db.Integer, ForeignKey('Daughter.id')))

现在我可以:

db.session.query(Parent).options(joinedload('sons')).options(joinedload('daughters)).filter(Parent.id == 1).first()

将返回一个Parent对象,我可以通过以下方式访问子节点:Parent.daughters,Parent.sons。

但我希望查询返回一个包含儿子和女儿的列表: [Son1,Daughter2,Son2]

如果我使用此查询:

db.session.query(Son, Daughter).select_from(Parent).join(Parent.sons).join(Parent.daughters).all()
它给我的回报是这样的: [(Son1,Daughter1),(Son2,Daughter1)等)]

这不是我想要的。 我需要一个查询来回复我父母的儿子和女儿的名单,并按年龄排序。那可能吗?

1 个答案:

答案 0 :(得分:0)

使用Child关系创建基本模型children并使用with_polymorphic

son_and_daughter = with_polymorphic(Child, [Son, Daughter], flat=True)

然后使用以下内容:

session.query(Parent).options(
    joinedload(Parent.children.of_type(son_and_daughter))
)

请参阅Inheritance loading