Обновление свойств модели Django при сохранении с обработкой отправленных полей ImageFields - PullRequest
1 голос
/ 19 декабря 2010

В основном я пытаюсь сохранить модель Django, которая содержит ImageField, и обновляет ее latitude и longitude FloatFields значениями, извлеченными из данных EXIF, содержащихся в изображении, если таковые имеются.

Вот пример модели, иллюстрирующей проблему:

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

Можете ли вы определить проблему?Я не знаю, как получить доступ к пути к файлу изображения до фактического сохранения экземпляра модели, и я не могу сохранить запись, обновить некоторые свойства, а затем снова сохранить ее, потому что это создаст цикл post_save (и то же самое теоретически происходит сpost_save сигнал…

Любая помощь очень ценится.

Примечание: Мне не нужна помощь ни в извлечении данных EXIF, ни в их разборе, только в способе обновлениявся модель при сохранении ().

Редактировать: Хорошо, так что вы можете получить доступ к объекту файла и обработать его до сохранения записи:

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)

1 Ответ

1 голос
/ 19 декабря 2010

FileField должен возвращать файлоподобный объект, который вы можете прочитать для извлечения exif-информации.

...