Еще интересная штука — если вдруг на файловой системе появилась ошибка и файл не удалился (например кто-то умный забрал права), то запись из базы все равно удаляется. Хорошо бы как-нибудь это дело поправить
Полное решение, правда, требует глубокого изучения всех возможных вариантов, но вот интересный маленький способ. Имеется вьюшка, которая в итоге должна будет удалить объект из базы. Пробуем удалить. При ошибках в файловой подсистеме Django выкинет OSError, но все равно удалит файл.
Точнее Django сначала удалит запись и только потом будет пытаться стереть файл
Красивого способа обойты это я пока не нашел, но можно привлечь базу данных. А именно: сделать откат транзакции, если была ошибка OSError. Вобщем план таков: запрещаем автоматическое подтверждение транзакции. Если не было OSError подтверждает вручную, иначе откатываем вручную
@transaction.commit_manually def deletedocument(request, ...): .... try: object.delete() except OSError: transaction.rollback() else: transaction.commit()
import os from django.core.files.storage import FileSystemStorage class FileSystemStorageFoldered(FileSystemStorage ): def delete(self, name, *args, **kwargs ): super(FileSystemStorageFoldered, self ).delete(name, *args, **kwargs ) try: os.removedirs(os.path.dirname(self.path(name ))) except OSError: passСначала мы удаляем сам файл методом родительского класса, а потом удаляем и сами папки. Если папки не пустые, то выкидывается исключение OSError, но в данном случае мы его просто игнорируем, так как именно такое поведение нам и нужно
file = models.FileField(upload_to = upload_callback_document,\ storage = FileSystemStorageFoldered )
Acer X960
[Print]
Гость