Скопируйте содержимое ImageField в новый путь к файлу в Django - PullRequest
3 голосов
/ 29 сентября 2011

У меня есть объект модели Django, у которого есть несколько нормальных атрибутов, и у него есть ImageField для логотипа.Я хочу написать метод, который будет копировать этот объект в новый объект.Достаточно легко создать новый объект, затем выполнить цикл по всем атрибутам и скопировать из старого в новый (например, new_object.name = old_object.name).Однако, если я сделаю это с полем логотипа (т.е. new_object.logo = old_object.logo), и new_object, и old_object указывают на один и тот же файл на жестком диске.Если вы отредактируете старый файл, логотип нового объекта изменится.

Какой лучший способ получить полную / глубокую копию ImageField?Я хочу, чтобы он имел другое имя файла и указывал на другой файл на диске, но он должен иметь точно такое же содержимое.

1 Ответ

3 голосов
/ 29 сентября 2011

Почему бы не создать забавную функцию для сигнала сохранения, которая копирует изображение файл туда, куда вам нужно, а затем создает новый объект с новым полем изображения?

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")

signal.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 из URL-адреса изображения

как вручную назначить поле изображения в Django

...