ファイルの名前をモデルの保存メソッドでアップロードした後に名前を変更しようとしています。私はファイルの主キーとファイルタイトルのスラッグの組み合わせにファイルの名前を変更しています。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()
を私は質問がアップロードされたファイルを再アップロードされていない場合、私はアップロードされたファイルの名前を変更することができますどのように誰もが知っている、であると仮定?これはロックされた/使用中のように見える唯一の時間です。
更新:
タイラーのアプローチは、新しいファイルが主キーが利用できないアップロードされ、下の彼のテクニックがエラーを投げているとき以外は、働いています。
if not instance.pk:
instance.save()
エラー:
maximum recursion depth exceeded while calling a Python object
は、主キーをつかむためにどのような方法がありますか?
私は実際にFileFieldに移動/名前の変更機能がない理由を疑っていました。 – Powerlord