【问题标题】:Update FileField filename after uploaded file saved (Django)上传文件保存后更新 FileField 文件名(Django)
【发布时间】:2014-08-09 07:12:17
【问题描述】:

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

我了解,如果您想这样做在上传时,您可以按照this 等问题中的解决方案进行操作,但我说的是更改已经上传的图像的名称在数据库中。

我尝试过覆盖ImageFileField 的名称属性,然后保存模型,但这不会影响文件本身。它只是破坏了引用,因为现在 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()

应该我在这里做什么?

【问题讨论】:

    标签: django python-2.7


    【解决方案1】:

    没有神奇而简单的方法可以做到这一点。当您从数据库加载对象时(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 而不是其他自定义存储类。在这种情况下,实现将需要适应特定的存储机制。

    【讨论】:

    • 呸,我希望不必这样做。谢谢。我正在考虑使用FieldFile's save method,但它最终可能同样令人费解。不管怎样,我现在可能不得不把它留到明天。再次感谢!
    • 使用 FieldFile 的保存方法也是一种选择,但会带来性能损失。首先,您必须读取内存中文件的内容,然后用不同的名称保存文件,然后使用 os.unlink 删除旧文件。
    • 没关系。这是一次性更新我们已经拥有的 8000 左右的模型。其余的可以使用链接问题中的方法处理!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2011-12-12
    • 2011-02-02
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多