在Django中将ImageField的内容复制到新文件路径

4 投票
1 回答
4086 浏览
提问于 2025-04-17 03:21

我有一个Django模型对象,它有一些普通的属性,还有一个用于存放logo的ImageField。我想写一个方法,把这个对象复制到一个新的对象里。创建新对象很简单,然后我可以遍历所有属性,把旧对象的值复制到新对象上(比如说 new_object.name = old_object.name)。但是如果我这样做logo字段(也就是 new_object.logo = old_object.logo),那么新对象和旧对象就会指向硬盘上同一个文件。如果你修改了旧文件,新对象的logo也会跟着变。

那么,怎么才能完整地复制这个ImageField呢?我希望它有一个不同的文件名,并且指向硬盘上不同的文件,但内容要完全一样。

相关问题:

1 个回答

3

为什么不创建一个在保存信号时会触发的函数,这个函数可以把图片文件复制到你想要的地方,然后再创建一个新的对象,里面有一个新的图片字段呢?

models.py

class ObjectOne(models.Model):
    logo = models.ImageField(...)

class ObjectTwo(models.Model):
    logo = models.ImageField(...)

from django.db.models.signals import post_save
from signals import my_signal
post_save.connect(my_signal, dispatch_uid="001")

signals.py

from models. import ObjectOne, ObjectTwo
def my_signal(sender, instance, *args, **kwargs):
    if sender is ObjectOne:
        new_obj = ObjectTwo()
        new_obj.logo.save("custom/path/new_filename.jpg",File(open(instance.image.url,"w"))
        new_obj.save()

我还没有测试过复制图片的代码,但这就是大致的想法。这里还有更多信息:

通过编程方式将图片保存到Django的ImageField

Django:从图片网址添加图片到ImageField

如何在Django中手动分配ImageField

撰写回答