Имеются следующие модели в алхимии:
RecordAndTask = Table('record_and_task', Base.metadata,
Column('record_id', String, ForeignKey('record.id'), primary_key=True),
Column('task_id', String, ForeignKey('task.id'), primary_key=True))
RecordAndWidget = Table('record_and_widget', Base.metadata,
Column('record_id', String, ForeignKey('record.id'), primary_key=True),
Column('widget_id', String, ForeignKey('widget.id'), primary_key=True))
class Record(Base):
__tablename__ = 'record'
id = Column(String, primary_key=True)
tasks = relationship('Task', secondary=RecordAndTask, backref=backref('records', lazy='dynamic'), lazy='dynamic')
widgets = relationship('Widget', secondary=RecordAndWidget, backref=backref('records', lazy='dynamic'), lazy='dynamic')
class Task(Base):
__tablename__ = 'task'
id = Column(String, primary_key=True)
status = Column(String)
widget_id = Column(String, ForeignKey('widget.id'))
class Widget(Base):
__tablename__ = 'widget'
id = Column(String, primary_key=True)
tasks = relationship('Task', backref='widget', lazy='dynamic')
В таблицах имеются следующие записи.
Таблица
record:
id='record_1'
id='record_2'
id='record_3'
Таблица
task:
id='task_1', status='done', widget_id='widget_1'
id='task_2', status='failed', widget_id='widget_3'
id='task_3', status='done', widget_id='widget_2'
Таблица
widget:
id='widget_1'
id='widget_2'
id='widget_3'
Таблица
record_and_task:
record_id='record_1', task_id='task_1'
record_id='record_1', task_id='task_2'
record_id='record_2', task_id='task_3'
Таблица
record_and_widget:
record_id='record_1', widget_id='widget_1'
record_id='record_1', widget_id='widget_3'
record_id='record_2', widget_id='widget_2'
Необходимо выполнить задачу (Task) ещё раз, если её статус (status) был не 'done'. Соответственно, в нашем случае мы заново выполняем задачу с task_id=2.
После выполнения задачи может измениться Widget. Соответственно в чём вопрос. Каким образом нужно внести эти обновления (изменение данных в Task), чтобы они затронули таблицу record_and_widget.
Другими словами, если в Task изменился Widget, нужно чтобы этот Widget изменился везде, где встречается. В этом конкретном случае - это таблица record_and_widget. В итоге должны получится вот такие данные в таблицах:
Таблица task:
id='task_1', status='done', widget_id='widget_1'
id='task_2', status='done', widget_id='widget_2' <- Изменился статус и id виджета
id='task_3', status='done', widget_id='widget_2'
Таблица record_and_widget:
record_id='record_1', widget_id='widget_1'
record_id='record_1', widget_id='widget_2' <- Должен измениться id и тут
record_id='record_2', widget_id='widget_2'
Пробовал добавлять различные onupdate, cascade в параметрах ForeignKey, колонок, но ничего не получается.
Как правильно это сделать? Вроде бы это какой-то стандартный вопрос по работе со связями, но правильная работа не выходит.