DMZ
09:49 06-05-2009

Еще интересная штука — если вдруг на файловой системе появилась ошибка и файл не удалился (например кто-то умный забрал права), то запись из базы все равно удаляется. Хорошо бы как-нибудь это дело поправить

Полное решение, правда, требует глубокого изучения всех возможных вариантов, но вот интересный маленький способ. Имеется вьюшка, которая в итоге должна будет удалить объект из базы. Пробуем удалить. При ошибках в файловой подсистеме Django выкинет OSError, но все равно удалит файл.

Точнее Django сначала удалит запись и только потом будет пытаться стереть файл

Красивого способа обойты это я пока не нашел, но можно привлечь базу данных. А именно: сделать откат транзакции, если была ошибка OSError. Вобщем план таков: запрещаем автоматическое подтверждение транзакции. Если не было OSError подтверждает вручную, иначе откатываем вручную

@transaction.commit_manually
def deletedocument(request, ...):
    ....

    try:
        object.delete()
    except OSError:
        transaction.rollback()
    else:
        transaction.commit()