gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:58:37 24 4
gpt4 key购买 nike

如何在 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()

应该在这里做什么?

最佳答案

没有魔法和简单的方法可以做到这一点。当您从数据库加载对象时(for 循环),video 属性引用的文件的名称也会从数据库加载。您不能只更改它并让基础文件更改它的名称。

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

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 而不是其他自定义存储类。在这种情况下,实现将需要适应特定的存储机制。

关于django - 上传文件保存后更新 FileField 文件名(Django),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24294888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com