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

2024-03-15

如何在 Django 中更改媒体文件(用户上传的文件)的文件名after已经保存了吗?

我明白如果你想这么做当它正在上传时您可以遵循以下问题的解决方案this https://stackoverflow.com/q/2546575/2588818,但我正在谈论更改数据库中已有图像的名称。

我尝试过覆盖的名称属性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()

What should我在这里做什么?


没有什么神奇且简单的方法可以做到这一点。当您从数据库加载对象时(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)

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保存上传文件后更新 FileField 文件名(Django) 的相关文章

随机推荐