У меня есть несколько моделей в SQLAlchemy, и мне нужно выполнять действие (удаление файла с диска) всякий раз, когда удаляется запись, связанная с этим файлом. Однако привязка слушателя к событию 'remove' для этого объекта не помогает.
Пример:
class ModelA(Base):
__tablename__ = 'modela'
id = Column(Integer, primary_key=True)
class ModelB(Base):
__tablename__ = 'modelb'
id = Column(Integer, primary_key=True)
id_modela = Column(Key, ForeignKey('modela.id', ondelete="CASCADE"), index=True, nullable=True, default=None)
modela = relationship('ModelA', backref=backref('modelbs', passive_deletes='all', lazy="dynamic"))
id_foo = Column(Key, ForeignKey('modelc.id', ondelete="SET NULL"), index=True, nullable=True)
foo = relationship('ModelC', foreign_keys='ModelB.id_foo', backref='modelbs')
class ModelC(Base):
__tablename__ = 'modelc'
id = Column(Integer, primary_key=True)
path = Column(String(256), nullable=False)
@event.listens_for(ModelB.foo, 'remove', propagate=True)
def my_listener(modela, foo, initiator):
os.remove(modela.foo.path)
Указанный выше слушатель никогда не вызывается при отправке запроса DELETE. на столе modela
. Как я могу сделать так, чтобы sqlalchemy обрабатывал такие каскадные удаления и вызывал мой слушатель событий всякий раз, когда удаление отправляется в родительскую таблицу?