如何通过子表主键对关系属性进行排序?我有一个模式,其中许多表都有一个共同的父级,父级有一个使用declaritive系统的每个子项的列表
class Scenario(Base):
__tablename__ = 'scenarios'
id = Column(Integer, primary_key=True, autoincrement=True)
class ScenarioMixin(object):
@declared_attr
def scenario_id(cls):
return Column(None, ForeignKey(Scenario.id),
primary_key=True,
index=True)
@declared_attr
def scenario(cls):
return relationship('Scenario',
backref=backref(cls.__tablename__))
# example scenario-specific table
class Child(Base, ScenarioMixin):
__tablename__ = 'children'
id1 = Column(String, primary_key=True)
id2 = Column(String, primary_key=True)
因此,场景对象有一个属性children,它是一个子列表。除了列表中的Child对象的顺序是任意的之外,这很好。这适用于应用程序的语义,它会导致不确定的行为。配置mixin的最佳方法是什么,以便每个子列表都按其表的主键排序,即使它是复合主键?
答案 0 :(得分:3)
在关系定义中指定order_by
参数,如下面的代码所示。
@declared_attr
def scenario(cls):
return relationship(
'Scenario',
backref=backref(
cls.__tablename__,
order_by=lambda: cls.__table__.primary_key.columns
),
)
在您的情况下,您无法立即返回cls.__table__.primary_key.columns
,因为在定义时,__table__
尚不存在。但是返回一个可调用的作品。
有关详细信息,请参阅Relationships API。