2

リレーションシップ属性を子テーブルの主キーでソートするにはどうすればよいですか? 多くのテーブルに共通の親があり、親にはこのような宣言システムを使用して各子のリストがあるスキーマがあります

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 を構成する最良の方法は何ですか?

4

1 に答える 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を参照してください。

于 2015-08-16T09:53:06.363 に答える