我有一个使用事件监听器和关系模型的问题,我的模型类是一个自引用表:
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))
一切都运行得很好。有人能告诉我代码中有什么问题吗?
答案 0 :(得分:0)
downlines
backref仅作为分发服务器模型实例的属性存在。它不是您用作侦听器目标的模型定义的属性。
幸运的是,在设置监听器的哪一方面没有太大区别。定义父(downlines
)上的关系并监听append
事件将触发您的处理程序,无论您是附加到downlines
还是设置分发服务器实例的upline
。