copy file from one model to another copy file from one model to another django django

copy file from one model to another


Inspired by Gerard's solution I came up with the following code:

from django.core.files.base import ContentFile#...class Example(models.Model):    file = models.FileField()    def duplicate(self):        """        Duplicating this object including copying the file        """        new_example = Example()        new_file = ContentFile(self.file.read())        new_file.name = self.file.name        new_example.file = new_file        new_example.save()

This will actually go as far as renaming the file by adding a "_1" to the filename so that both the original file and this new copy of the file can exist on disk at the same time.


Although this is late, but I would tackle this problem thus,

class UploadImage(models.Model):    Image = models.ImageField(upload_to="temp/")    # i need to delete the temp uploaded file from the file system when i delete this model          # from the database    def delete(self, using=None):        name = self.Image.name        # i ensure that the database record is deleted first before deleting the uploaded         # file from the filesystem.        super(UploadImage, self).delete(using)        self.Image.storage.delete(name)class RealImage(models.Model):   Image = models.ImageField(upload_to="real/")# in my view or where ever I want to do the copying i'll do thisimport osfrom django.core.files import Fileuploaded_image = UploadImage.objects.get(id=image_id).Imagereal_image = RealImage()real_image.Image = File(uploaded_image, uploaded_image.name)real_image.save()uploaded_image.close()uploaded_image.delete()

If I were using a model form to handle the process, i'll just do

# django model forms provides a reference to the associated model via the instance propertyform.instance.Image = File(uploaded_image, os.path.basename(uploaded_image.path))form.save()uploaded_image.close()uploaded_image.delete()

note that I ensure the uploaded_image file is closed because calling real_image.save() will open the file and read its content. That is handled by what ever storage system is used by the ImageField instance


Try doing that without using a form. Without knowing the exact error that you are getting, I can only speculate that the form's clean() method is raising an error because of a mismatch in the upload_to parameter.

Which brings me to my next point, if you are trying to copy the image from 'temp/' to 'real/', you will have to do a some file handling to move the file yourself (easier if you have PIL):

import Imagefrom django.conf import settingsu = UploadImage.objects.get(id=image_id)im = Image.open(settings.MEDIA_ROOT + str(u.Image))newpath = 'real/' + str(u.Image).split('/', 1)[1]im.save(settings.MEDIA_ROOT + newpath)r = RealImage.objects.create(Image=newpath)

Hope that helped...