Search code examples
djangodjango-modelssignalsdjango-ormimagefield

Updating properties of a Django model on save with processing of submitted ImageFields


Basically I'm trying to save a Django model which contains an ImageField, and updates its latitude and longitude FloatFields with values grabbed from the EXIF data contained in the image, if any.

Here's a sample model illustrating the issue:

class GeoImage(models.Model):
    image = models.ImageField(upload_to='/path/to/uploads')
    latitude = models.FloatField(null=True, blank=True)
    longitude = models.FloatField(null=True, blank=True)

    def save(self):
        # grab the path of the image of the ImageField
        # parse the EXIF data, fetch latitude and longitude
        self.latitude = fetched_latitude
        self.longitude = fetched_longitude
        return super(GeoImage, self).save()

Can you spot the problem? I don't know how to access the image filepath before the model instance is actually saved, and I can't save the record, update some properties then save it back again, because it would create a post_save loop (and same goes theorically with a post_save signal…

Any help much appreciated.

Note: I don't need help with EXIF data extraction nor parsing, just with the way to update the whole model on save().

Edit: Okay so you can access the file object and process it further before the record being saved:

class GeoImage(models.Model):
    image = models.ImageField(upload_to='/path/to/uploads')
    latitude = models.FloatField(null=True, blank=True)
    longitude = models.FloatField(null=True, blank=True)

    def save(self):
        latitude, longitude = gps_utils.process_exif(self.image.file)
        if latitude: self.latitude = latitude
        if longitude: self.longitude = longitude
        return super(GeoImage, self).save(*args, **kwarg)

Solution

  • The FileField should return a file-like object that you can read to extract exif information.