保存上传文件后更新FileField文件名(Django)

时间:2014-06-18 20:55:59

标签: django python-2.7

如何在保存之后更改Django 中媒体文件(用户上传文件)的文件名?

我理解,如果您想要上传,那么您可以按照this之类的问题来解决问题,但我正在谈论更改图片的名称已经在数据库中。

我已尝试覆盖ImageFileField的name属性,然后保存模型,但这不会影响文件本身。它只是打破了引用,因为现在ImageFileField指向新名称,但文件仍然是旧名称。

使用与链接问题相同的示例模型:

class SomeModel(models.Model):
    title = models.CharField(max_length=100)
    video = models.FileField(upload_to='video')

这不起作用:

>>> for m in SomeModel.objects.all():
...   m.video.name = 'new_video_name.avi'
...   m.save()

应该我在这做什么?

1 个答案:

答案 0 :(得分:0)

没有神奇而简单的方法可以做到这一点。从数据库(for循环)加载对象时,视频属性引用的文件名也从数据库加载。您不能只是更改它并使基础文件更改它的名称。

为了在数据库中完成物理文件和引用的名称更改,您必须手动重命名物理文件。这样的事情应该有效:

import os

class SomeModel(models.Model):
    file_field = ... 

    def rename(self, new_name):
        old_path = self.file_field.path
        self.file_field.name = new_name

        os.rename(old_path, self.file_field.path)
        self.save()


for m in SomeModel.objects.all():
    new_name = compute_new_filename(m)
    m.rename(new_name)

请注意,这是一个简化版本,可能需要在执行os.rename()时对可能的IO错误进行一些处理。

此代码假定您使用的是FileSystemStorage而不是其他自定义存储类。在这种情况下,实现将需要适应特定的存储机制。