2011-07-07 54 views
1

我必須使用事件偵聽器與關係模型的問題,我的模型類是一個自我引用的表:SQLAlchemy的事件偵聽器和關係問題

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) 

會給出一個埃羅R:AttributeError的:對象類型「分銷商」有沒有屬性「下線」

,但它是確定寫類似:

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

而且我還發現,如果我重寫關係到這一點:

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

一切都運行完美。有人能告訴我代碼中有什麼問題嗎?

回答

0

downlines backref只作爲分發服務器模型實例的屬性而存在。它不是您用作偵聽器目標的模型定義的屬性。

幸運的是,您設置偵聽器的哪一方並沒有多大區別。定義父母關係(downlines)並監聽append事件將觸發您的處理程序,無論您是追加到downlines還是設置分銷商實例的upline