如何在保存之后更改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()
应该我在这做什么?
答案 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而不是其他自定义存储类。在这种情况下,实现将需要适应特定的存储机制。