0

私はSQLAlchemyに単純なClientモデルを持っており、主に宣言型を使用しています。このモデルにはnameフィールドがあり、モデルと多対多の関係がありMetaphoneCodeます。コードは次のようになります。

class MetaphoneCode(Base):
    """Represents a metaphone code
    """
    __tablename__ = 'mcodes'
    id = Column(Integer, Sequence('mcodes_seq_id'), primary_key=True)
    code = Column(String(20), index=True, nullable=False)


client_mcode_assoc_table = Table(
    'client_mcodes',
    Base.metadata,
    Column('client_id', ForeignKey('clients.id')),
    Column('mcode_id', ForeignKey('mcodes.id')))


class Client(Base):
    __tablename__ = 'clients'
    id = Column(Integer, Sequence('client_id_seq'), primary_key=True)
    name = Column(Unicode(100), index=True)
    mcodes = relationship('MetaphoneCode', secondary=client_mcode_assoc_table)

ここで、metaphone コードname自体が変更されたときに変更する必要があるため、この必要性を表現してclient.name = "John Doe"、それらの名前 (姓と名) に関連する metaphone コードを計算し、mcodes関係を更新したいと考えています。

更新:以下に引用する簡単な解決策を見つけました。私の質問は、「ORM 属性イベント システムは、別の属性の変更に応じて属性を更新するためのベスト プラクティス メカニズムですか?

4

2 に答える 2

0

イベントを使用してそれを行うことができました:

@event.listens_for(Client.name, 'set')
def update_mcodes(target, value, oldvalue, initiator):
    target.recalculate_mcodes(value)

それでも、これはこれを行うための推奨される方法ですか?@Xaqq によって提案されたハイブリッド アプローチを読み、それがこれよりも優れているかどうかを判断しeventます。

于 2013-06-07T13:40:35.240 に答える
0

おそらく、ゲッターとセッターを使用すると問題を解決できるでしょう。

SqlAlchemy は、モデルの属性にゲッターとセッターを追加する方法を提供します。私はそれらを自分で使用したことはありません。http://docs.sqlalchemy.org/en/rel_0_8/orm/extensions/hybrid.htmlを参照してください。

ただし、これらのセッター内でビジネス ロジック コードを実行するのが適切かどうかはわかりません。たぶん、経験豊富な人が教えてくれるでしょう。

于 2013-06-06T19:59:01.293 に答える