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

时间:2011-09-29 10:35:55

标签: python django django-models

我有一个Django模型对象,它有一些普通的属性,并且它有一个用于徽标的ImageField。我想写一个方法,将该对象复制到一个新对象。实例化新对象很容易,然后循环遍历所有属性并从旧复制到新对象(例如new_object.name = old_object.name)。但是,如果我使用徽标字段(即new_object.logo = old_object.logo)执行此操作,则new_object和old_object都指向硬盘上的同一文件。如果您编辑旧文件,新对象的徽标将会更改。

拥有ImageField的完整/深层副本的最佳方法是什么?我希望它具有不同的文件名并指向磁盘上的不同文件,但它应该具有完全相同的内容。

1 个答案:

答案 0 :(得分: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()

我没有测试图像复制代码,但这是一般的想法。这里有更多:

Programmatically saving image to Django ImageField

Django: add image in an ImageField from image url

how to manually assign imagefield in Django