When saving, how can you check if a field has changed?

django, django-models

Solution

Essentially, you want to override the `__init__` method of `models.Model` so that you keep a copy of the original value. This makes it so that you don't have to do another DB lookup (which is always a good thing).

    class Person(models.Model):
        name = models.CharField()

        __original_name = None

        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.__original_name = self.name

        def save(self, force_insert=False, force_update=False, *args, **kwargs):
            if self.name != self.__original_name:
                # name changed - do something here

            super().save(force_insert, force_update, *args, **kwargs)
            self.__original_name = self.name

Problem

In my model I have : ``` class Alias(MyBaseModel): remote_image = models.URLField( max_length=500, null=True, help_text=''' A URL that is downloaded and cached for the image. Only used when the alias is made ''' ) image = models.ImageField( upload_to='alias', default='alias-default.png', help_text="An image representing the alias" ) def save(self, *args, **kw): if (not self.image or self.image.name == 'alias-default.png') and self.remote_image : try : data = utils.fetch(self.remote_image) image = StringIO.StringIO(data) image = Image.open(image) buf = StringIO.StringIO() image.save(buf, format='PNG') self.image.save( hashlib.md5(self.string_id).hexdigest() + ".png", ContentFile(buf.getvalue()) ) except IOError : pass ``` Which works great for the first time the `remote_image` changes. How can I fetch a new image when someone has modified the `remote_image` on the alias? And secondly, is there a better way to cache a remote image?

Original source

Related problems