@MoonMeTwice

Как обновить данные в ассоциативной таблице?

Имеются следующие модели в алхимии:
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, колонок, но ничего не получается.
Как правильно это сделать? Вроде бы это какой-то стандартный вопрос по работе со связями, но правильная работа не выходит.
  • Вопрос задан
  • 135 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы