[Django]-How to copy an object from one model to another model

4👍

You’ll need to copy the properties of one object to another object. create is used when you want to create a new instance, not when you want to update a specific instance.

m_pro = m_pro_set[0] # m_pro_set is a list and need to get the specific instance
m_pro.image = m_back_1.image
m_pro.caption = m_back_1.caption
m_pro.pub_date = m_back_1.pub_date
m_pro.save()

Alternatively you can create a method on ProfilePicture if this is a common operation to contain this functionality.

class ProfilePicture(models.Model):
    user = models.ForeignKey(User)
    image = models.ImageField(upload_to=get_upload_file_name)
    caption = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

    def update(self, bg_img):
        self.image = bg_img.image
        self.caption = bg_img.caption
        self.pub_date = bg_img.pub_date
        self.save()

So you would just need to call m_pro_1.update(m_back_1) if we wanted to make m_pro_1 have the same properties as m_back_1

Also, if you wanted to create a new instance, I’d suggest using a classmethod like the following

class ProfilePicture(models.Model):
    ...

    @classmethod
    def create_from_bg(cls, bg_img):
        img = cls(user=bg_img.user, image=bg_img.image, caption=bg_img.caption, pub_date=bg_img.pub_date)
        img.save()
        return img

    @classmethod
    def create_from_photo(cls, photo):
        img = cls(user=photo.album.user, image=photo.image, caption=photo.caption, pub_date=photo.pub_date)
        img.save()
        return img

This creates a new ProfilePicture and is used: profile_pic = ProfilePicture.create_from_bg(m_back_1)

Leave a comment