Я знаю, что этот вопрос уже был задан, так как я не смог найти чистого решения.
Моя проблема проста: у меня есть таблица со связью «многие ко многим».Там, где у пользователей много рабочих пространств, и у рабочих пространств много пользователей.
invitations_table = db.Table('invitations', db.Model.metadata,
db.Column('user_id', db.Integer, db.ForeignKey('user.id', ondelete='cascade'), primary_key=True),
db.Column('workspace_id', db.Integer, db.ForeignKey('workspace.id', ondelete='cascade'), primary_key=True)
)
Теперь мои два класса объявлены так:
class Workspace(db.Model):
id = db.Column(db.Integer, primary_key = True)
...
u_invited = db.relationship("User",
secondary = invitations_table,
cascade = 'all',
back_populates = "w_invited")
class User(db.Model):
id = db.Column(db.Integer, primary_key = True)
...
w_invited = db.relationship("Workspace",
secondary = invitations_table,
back_populates = "u_invited")
Теперь, если я удалюВ моей рабочей области я также не могу каскадно удалить удаление в ассоциативной таблице:
def delete_all_workspace(self):
workspace = Workspace.query.filter_by(owner=self)
# for w in workspace.all():
# w.u_invited.clear()
succeed = workspace.delete()
db.session.commit()
Проблема заключается в следующем: мне нужно, как некоторые люди предлагают, вручную зацикливаться на моем списке объектов, затем вызывать clear (), чтобы не получить это исключение:
sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) update or delete on table "workspace" violates foreign key constraint "invitations_workspace_id_fkey" on table "invitations"
DETAIL: Key (id)=(142) is still referenced from table "invitations".
Хотя ondelete = 'cascade' достаточно, чтобы sqlalchemy также удалила ассоциативную таблицу, но она работает не так, как ожидалось.
Мой вопрос: есть ли способ заставить SQLAlchemy также очищать приглашения ассоциативных таблиц, не обременяя их очистку вручную?
Спасибо за ваши ответы