我正在尝试重命名文件,因为它已在模型的save方法中上传.我正在将文件重命名为文件主键和文件标题的组合.
我首先上传文件,上传新文件,文件或文件标题没有变化时都能正常工作.
但是,当文件的标题更改,并且系统尝试将旧文件重命名为新路径时,我收到以下错误:
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
有没有办法抓住主键?
我想你应该仔细看看upload_to字段.这可能比在保存期间重命名更简单.
http://docs.djangoproject.com/en/dev/ref/models/fields/#filefield
这也可以是可调用的,例如函数,它将被调用以获得上载路径,包括文件名.这个callable必须能够接受两个参数,并返回一个Unix风格的路径(带有正斜杠)以传递给存储系统.将传递的两个参数是: