The argument that all related operations signals happen inside transaction is OK for me. Ditto for wrapping .delete() and .update() in atomic(savepoint=False), that doesn't cost much.