He agregado los campos de width y height de la imagen a un modelo basado en ImageField:
class Photo(models.Model): height = models.IntegerField() width = models.IntegerField() image = models.ImageField( upload_to=settings.PHOTO_UPLOAD_TO, height_field='height', width_field='width' ) Cuando hago manage.py makemigrations , se me pide el valor predeterminado para las filas existentes. Ya tengo muchas fotos en la base de datos (es un sitio en ejecución), por lo tanto, elegí agregar default=0 a width y height .
height = models.IntegerField(default=0) width = models.IntegerField(default=0) Ahora, para todas las fotos existentes, las dos columnas se completan con ceros, como se esperaba. Sin embargo, lo que no esperaba era que Photo.objects.all()[0].width y .height ahora devolvieran los valores correctos distintos de cero. ¿Por qué? No pude encontrar nada sobre tal comportamiento en la documentación .
Parece que la magia se está realizando en el método ImageField.update_dimension_fields de Django. Los comentarios en el código dicen:
Actualice los campos de ancho y alto del campo, si están definidos.
Este método está conectado a la señal post_init del modelo para actualizar las dimensiones después de instanciar una instancia del modelo. Sin embargo, las dimensiones no se actualizarán si los campos de dimensiones ya están completos. Esto evita recálculos innecesarios al cargar un objeto de la base de datos.
Se puede forzar la actualización de las dimensiones con
force=True, que es comoImageFileDescriptor.__set__llama a este método.
Entonces, al crear una instancia del modelo, update_dimension_fields lee las dimensiones del archivo de imagen y las almacena en la instancia. Esto incurrirá en un pequeño golpe en un entorno en vivo.
Guardar todas las imágenes almacenará las dimensiones en la base de datos:
In [1]: for p in Photo.objects.all(): ...: p.save()La documentación dice https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.ImageField.height_field
ImageField.height_field:
Nombre de un campo de modelo que se completará automáticamente con la altura de la imagen cada vez que se guarde la instancia del modelo .
el modelo save () debe haber rellenado automáticamente tanto la height como el width