Django-exiffield: невозможно загрузить изображение из-за разного формата 'CreateDate' и 'DateTimeField'
Я новичок в Django, надеюсь, вы сможете мне помочь.
Я разрабатываю приложение для фотогалереи, и сейчас я пытаюсь реализовать извлечение данных EXIF. Это работает довольно хорошо с фотографиями, которые были загружены до миграции модели, однако, когда я пытаюсь загрузить новую фотографию, я получаю эту ошибку:
ValidationError at /admin/picture/picture/add/
['“2021:11:12 15:26:56” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format.']
Похоже, что DateTimeField и CreateDate в EXIF используют разный формат: DateTimeField использует YYYY-MM-DD HH:MM, а CreateDate в EXIF использует YYYY:MM:DD HH:MM.
Есть ли способ решить эту проблему?
Вот моя фотомодель:
from exiffield.fields import ExifField
from exiffield.getters import exifgetter
class Picture(models.Model):
image = models.ImageField(upload_to=get_image_upload_path)
[...]
# METADATA
created_on = models.DateTimeField(blank=True, editable=False, null=True)
width = models.PositiveIntegerField(editable=False, blank=True, null=True)
height = models.PositiveIntegerField(editable=False, blank=True, null=True)
size = models.CharField(max_length=20, editable=False, blank=True, null=True)
camera_make = models.CharField(max_length=20, editable=False, blank=True, null=True)
camera_model = models.CharField(max_length=20, editable=False, blank=True, null=True)
lens = models.CharField(max_length=20, editable=False, blank=True, null=True)
iso = models.PositiveIntegerField(editable=False, blank=True, null=True)
shutter_speed = models.CharField(max_length=20, editable=False, blank=True, null=True)
latitude = models.CharField(max_length=20, editable=False, blank=True, null=True)
longitude = models.CharField(max_length=20, editable=False, blank=True, null=True)
exif = ExifField(
source='image',
denormalized_fields={
'created_on': exifgetter('CreateDate'),
'width': exifgetter('ImageWidth'),
'height': exifgetter('ImageHeight'),
'size': exifgetter('FileSize'),
'camera_make': exifgetter('Make'),
'camera_model': exifgetter('Model'),
'lens': exifgetter('LensInfo'),
'iso': exifgetter('ISO'),
'shutter_speed': exifgetter('ShutterSpeed'),
'latitude': exifgetter('GPSLatitude'),
'longitude': exifgetter('GPSLongitude'),
},
)
А вот полная ошибка:
Заранее большое спасибо!
Мне удалось решить проблему, так как в exiffield есть специальный getter для этого:
get_datetaken -> Optional[datetime]
Получение времени создания файла в виде datetime
Итак, я сделал следующее:
class Picture(models.Model):
image = models.ImageField(upload_to='images')
[...]
# METADATA
created_on = models.DateTimeField(editable=False, blank=True, null=True)
exif = ExifField(
source='image',
denormalized_fields={
'created_on': get_datetaken,
},
)