【发布时间】:2009-03-12 02:14:52
【问题描述】:
我正在尝试在模型的保存方法中上传文件后重命名文件。我将文件重命名为文件主键和文件标题的组合。
当第一次上传文件、上传新文件以及文件或文件标题没有更改时,我都可以使用它。
但是,当文件的标题被更改,并且系统尝试将旧文件重命名为新路径时,我收到以下错误:
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()
我想问题是,有没有人知道当上传的文件没有被重新上传时如何重命名上传的文件?那是它似乎被锁定/使用中的唯一一次。
更新:
Tyler 的方法是有效的,除非上传新文件时主键不可用并且他的以下技术会引发错误。
if not instance.pk:
instance.save()
错误:
maximum recursion depth exceeded while calling a Python object
有什么方法可以获取主键吗?
【问题讨论】:
-
我其实在想为什么 FileField 上没有移动/重命名功能。