Слушатель событий Sqlalchemy и проблема отношений - PullRequest
1 голос
/ 07 июля 2011

У меня проблема с использованием прослушивателя событий с моделью отношений, мой класс модели представляет собой таблицу с самоссылкой:

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: тип объекта «Распространитель» не имеет атрибута «downlines»

но можно написать что-то вроде:

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

и я также обнаружил, что если переписать отношение к этому:

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

все работает отлично. Может кто-нибудь сказать мне, что не так в коде?

1 Ответ

0 голосов
/ 17 февраля 2012

Обратная ссылка downlines существует только в качестве атрибута в экземпляре модели распространителя. Это не атрибут определения модели, который вы используете в качестве цели для слушателя.

К счастью, не имеет большого значения, с какой стороны вы установите слушателя. Определение отношения для родителя (downlines) и прослушивание события append вызовет ваш обработчик независимо от того, добавляете ли вы к downlines или устанавливаете upline экземпляра распространителя.

...