Я пытаюсь переименовать файл после его загрузки в метод сохранения модели. Я переименовываю файл в комбинацию первичного ключа и фрагмента заголовка файла.
У меня это работает при первой загрузке файла, при загрузке нового файла и при отсутствии изменений в файле или заголовке файла.
Однако, когда заголовок файла изменяется, и система пытается переименовать старый файл в новый путь, я получаю следующую ошибку:
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()
Полагаю, вопрос в том, знает ли кто-нибудь, как я могу переименовать загруженный файл, если загруженный файл не загружается повторно? Это единственный раз, когда кажется, что он заблокирован / используется.
Обновление:
Подход Тайлера работает, за исключением того, что при загрузке нового файла первичный ключ недоступен и его методика ниже выдает ошибку.
if not instance.pk:
instance.save()
Ошибка:
maximum recursion depth exceeded while calling a Python object
Есть ли способ получить первичный ключ?