Sqlalchemy事件监听器和关系问题

时间:2011-07-07 19:32:27

标签: sqlalchemy self-reference

我有一个使用事件监听器和关系模型的问题,我的模型类是一个自引用表:

class Distributor(Base):
    __tablename__ = "distributors"

    id = Column(Integer, primary_key=True)
    name = Column(String, nullable = False)
    upline_id = Column(Integer, ForeignKey('distributors.id'))

    upline = relationship('Distributor', remote_side=id, backref=backref('downlines'))

我想在添加到下线集合时注册一个监听器:

def my_append_listener(target, value, initiator):
    branch_develop = len(target.downlines)

和这一行:

event.listen(Distributor.downlines, 'append', my_append_listener)

将给出错误:AttributeError:type object'Distributor'没有属性'downlines'

但可以这样写:

george = Distributor("george", None)
george.downlines = [Distributor("downlineUser")]

我还发现,如果我重写与此的关系:

downlines = relationship('Distributor', backref=backref('upline', remote_side=id))
一切都运行得很好。有人能告诉我代码中有什么问题吗?

1 个答案:

答案 0 :(得分:0)

downlines backref仅作为分发服务器模型实例的属性存在。它不是您用作侦听器目标的模型定义的属性。

幸运的是,在设置监听器的哪一方面没有太大区别。定义父(downlines)上的关系并监听append事件将触发您的处理程序,无论您是附加到downlines还是设置分发服务器实例的upline