我有一个Django模型对象,它有一些正常的属性,它有一个标志的ImageField。我想写一个方法,将这个对象复制到一个新对象。很容易实例化新对象,然后循环遍历所有属性并从旧对象复制到新对象(例如new_object.name = old_object.name
)。但是,如果使用logo字段(即new_object.logo = old_object.logo
)执行此操作,则new_对象和old_对象都指向硬盘上的同一文件。如果编辑旧文件,新对象的徽标将更改。
有完整/深入的ImageField副本的最佳方法是什么?我希望它有一个不同的文件名并指向磁盘上的不同文件,但它应该有完全相同的内容。
最佳答案
为什么不创建一个在保存信号上很有趣的函数,将图像文件复制到您想要的任何位置,然后创建一个新的对象和一个新的图像字段?
模型.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")
信号.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