0

Client在 SQLAlchemy 中有一个简单的模型,主要使用声明性。这个模型有一个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)

现在,由于变音位代码必须在name自身发生变化时发生变化,所以我想表达这种需求,以便当我这样做时,client.name = "John Doe"我想计算与这些名称(名字和姓氏)相关的变音位代码并mcodes更新关系。

更新:我找到了一个简单的解决方案,如下所示;所以我的问题最好表述为“ ORM 属性事件系统是更新属性以响应另一个属性更改的最佳实践机制吗?

4

2 回答 2

0

也许使用 getter 和 setter 可以解决您的问题。

SqlAlchemy 提供了一种将 getter 和 setter 添加到模型属性的方法。我自己从未使用过它们。请参阅http://docs.sqlalchemy.org/en/rel_0_8/orm/extensions/hybrid.html

但是我不知道在这些设置器中运行业务逻辑代码是否是一种好习惯。也许有经验的人会告诉我们。

于 2013-06-06T19:59:01.293 回答
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 回答