2011-09-29 30 views
2

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

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

回答

2

为什么不创建一个有趣的保存信号功能,它将图像文件复制到任何你想要的,然后创建一个新的对象与一个新的图像字段?

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

相关问题