按主键对 sqlalchemy 关系进行排序

问题描述 投票:0回答:1

如何使关系属性按子表主键排序?我有一个模式,其中许多表都有一个共同的父表,并且父表使用像这样的声明式系统有每个子表的列表

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,它是子级列表。这工作得很好,只是列表中子对象的顺序是任意的。虽然这对于应用程序的语义来说是可以的,但它会导致不确定的行为。配置 mixin 以便每个子列表都按其表的主键排序(即使它是复合主键)的最佳方法是什么?

python sqlalchemy orm non-deterministic
1个回答
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__
还不存在。但返回一个可调用的作品。

请参阅关系 API 了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.