我有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)等)]
这不是我想要的。 我需要一个查询来回复我父母的儿子和女儿的名单,并按年龄排序。那可能吗?
答案 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))
)