Flask 顺序记录 2 children 列
Flask order records by 2 children columns
我有一个 table 结构如下:
id = db.Column(db.BigInteger, primary_key=True)
child1Id = db.Column(db.BigInteger, db.ForeignKey('child1.id'))
child1 = db.relationship("Child1Model", uselist=False, foreign_keys=[child1Id])
child2Id = db.Column(db.BigInteger, db.ForeignKey('child2.id'))
child2 = db.relationship("Child2Model", uselist=False, foreign_keys=[child2Id])
child3Id = db.Column(db.BigInteger, db.ForeignKey('child3.id'))
child3 = db.relationship("Child3Model", uselist=False, foreign_keys=[child3Id])
所有 3 个 children table 都有一个 ID 和一个名称,以及其他列。为了根据 child1 的名字对 parent 进行排序,我定义了以下混合 属性 和表达式:
@hybrid_property
def child1Name(self):
return self.child1.name
@child1Name.expression
def child1Name(cls):
return select([Child1Model.name]).where(Child1Model.id == cls.child1Id).as_scalar()
当我调用 Parent.query.order_by(Parent.child1Name).all()
时,表达式按预期工作。
现在,对于 child2 和 child3,只会设置其中一个,因此当 parent 实体设置了 child2 时,child3 为 None,反之亦然。我想根据 child2 和 child3 的名称对 parent 进行排序,例如,如果我有一个设置了 child2 的 parent 实体,并且 child2.name = "B" 和另一个设置了 child3 且 child3.name = "A" 的 parent,应首先返回第二个 parent。我试图定义以下混合 属性:
@hybrid_property
def child2Or3Name(self):
if self.child2Id is not None:
return self.child2.name
return self.child3.name
@child2Or3Name.expression
def child2Or3Name(cls):
if cls.child2Id is not None:
return select([Child2Model.name]).where(Child2Model.id == cls.child2Id).as_scalar()
return select([Child3Model.name]).where(Child3Model.id == cls.child3Id).as_scalar()
但是当我调用 Parent.query.order_by(Parent.child2Or3Name).all()
时,返回了数据,但顺序不正确。我应该如何定义混合 属性 及其表达式?
找到解决方案,表达式应如下所示:
@child2Or3Name.expression
def child2Or3Name(cls):
s1 = select([Child2Model.name]).where(Child2Model.id == cls.child2Id)
s2 = select([Child3Model.name]).where(Child3Model.id == cls.child3Id)
return s1.union_all(s2).as_scalar()
我有一个 table 结构如下:
id = db.Column(db.BigInteger, primary_key=True)
child1Id = db.Column(db.BigInteger, db.ForeignKey('child1.id'))
child1 = db.relationship("Child1Model", uselist=False, foreign_keys=[child1Id])
child2Id = db.Column(db.BigInteger, db.ForeignKey('child2.id'))
child2 = db.relationship("Child2Model", uselist=False, foreign_keys=[child2Id])
child3Id = db.Column(db.BigInteger, db.ForeignKey('child3.id'))
child3 = db.relationship("Child3Model", uselist=False, foreign_keys=[child3Id])
所有 3 个 children table 都有一个 ID 和一个名称,以及其他列。为了根据 child1 的名字对 parent 进行排序,我定义了以下混合 属性 和表达式:
@hybrid_property
def child1Name(self):
return self.child1.name
@child1Name.expression
def child1Name(cls):
return select([Child1Model.name]).where(Child1Model.id == cls.child1Id).as_scalar()
当我调用 Parent.query.order_by(Parent.child1Name).all()
时,表达式按预期工作。
现在,对于 child2 和 child3,只会设置其中一个,因此当 parent 实体设置了 child2 时,child3 为 None,反之亦然。我想根据 child2 和 child3 的名称对 parent 进行排序,例如,如果我有一个设置了 child2 的 parent 实体,并且 child2.name = "B" 和另一个设置了 child3 且 child3.name = "A" 的 parent,应首先返回第二个 parent。我试图定义以下混合 属性:
@hybrid_property
def child2Or3Name(self):
if self.child2Id is not None:
return self.child2.name
return self.child3.name
@child2Or3Name.expression
def child2Or3Name(cls):
if cls.child2Id is not None:
return select([Child2Model.name]).where(Child2Model.id == cls.child2Id).as_scalar()
return select([Child3Model.name]).where(Child3Model.id == cls.child3Id).as_scalar()
但是当我调用 Parent.query.order_by(Parent.child2Or3Name).all()
时,返回了数据,但顺序不正确。我应该如何定义混合 属性 及其表达式?
找到解决方案,表达式应如下所示:
@child2Or3Name.expression
def child2Or3Name(cls):
s1 = select([Child2Model.name]).where(Child2Model.id == cls.child2Id)
s2 = select([Child3Model.name]).where(Child3Model.id == cls.child3Id)
return s1.union_all(s2).as_scalar()