Я пытаюсь переименовать файл после его загрузки в метод сохранения модели. Я переименовываю файл в комбинацию первичного ключа файлов и пули названия файла.Django: Загруженный файл заблокирован. Невозможно переименовать
У меня есть работа, когда файл загружается первым, когда загружается новый файл и когда нет изменений в названии файла или файла.
Однако, когда название файла изменяется, и система пытается переименовать старый файл на новый путь, я получаю следующее сообщение об ошибке:
WindowsError at /admin/main/file/1/
(32, 'The process cannot access the file because it is being used by another process')
Я действительно не знаю, как получить вокруг этого. Я пробовал просто копировать файл на новый путь. Это работает, но я не знаю, что могу удалить старую версию.
Укороченная Модель:
class File(models.Model):
nzb = models.FileField(upload_to='files/')
name = models.CharField(max_length=256)
name_slug = models.CharField(max_length=256, blank=True, null=True, editable=False)
def save(self):
# Create the name slug.
self.name_slug = re.sub('[^a-zA-Z0-9]', '-', self.name).strip('-').lower()
self.name_slug = re.sub('[-]+', '-', self.name_slug)
# Need the primary key for naming the file.
super(File, self).save()
# Create the system paths we need.
orignal_nzb = u'%(1)s%(2)s' % {'1': settings.MEDIA_ROOT, '2': self.nzb}
renamed_nzb = u'%(1)sfiles/%(2)s_%(3)s.nzb' % {'1': settings.MEDIA_ROOT, '2': self.pk, '3': self.name_slug}
# Rename the file.
if orignal_nzb not in renamed_nzb:
if os.path.isfile(renamed_nzb):
os.remove(renamed_nzb)
# Fails when name is updated.
os.rename(orignal_nzb, renamed_nzb)
self.nzb = 'files/%(1)s_%(2)s.nzb' % {'1': self.pk, '2': self.name_slug}
super(File, self).save()
Я полагаю, что вопрос, кто-нибудь знает, как я могу переименовать загруженный файл, если загруженный файл не может быть повторно загружен? Это единственный раз, когда кажется, что он заблокирован/используется.
Update: подход
Тайлер работает, за исключением того, когда новый файл загружен первичный ключ не доступен, и его метод ниже бросает ошибку.
if not instance.pk:
instance.save()
Ошибка:
maximum recursion depth exceeded while calling a Python object
Есть ли способ, чтобы захватить первичный ключ?
Я действительно задавался вопросом, почему на FileField нет функции move/rename. – Powerlord