我已将图片width
和height
字段添加到基于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'
)
当我执行manage.py makemigrations
时,系统会要求我提供现有行的默认值。我在数据库中已经有很多照片(它是一个正在运行的网站),因此我选择将default=0
添加到width
和height
。
height = models.IntegerField(default=0)
width = models.IntegerField(default=0)
现在,对于所有现有照片,两列都填充了零,如预期的那样。然而,我没想到的是Photo.objects.all()[0].width
和.height
现在返回正确的非零值。为什么?我无法在documentation中找到有关此类行为的任何内容。
答案 0 :(得分:2)
似乎魔术正在Django的ImageField.update_dimension_fields
方法中执行。代码中的注释说:
更新字段的宽度和高度字段(如果已定义)。
此方法与模型的post_init信号相连接以进行更新 实例化模型实例后的尺寸。但是,尺寸 如果已填充维度字段,则不会更新。这个 避免从加载对象时不必要的重新计算 数据库中。
可以使用
force=True
强制更新维度,具体方法如下ImageFileDescriptor.__set__
调用此方法。
因此,在实例化模型时,update_dimension_fields
从图像文件中读取维度并将其存储在实例上。这将在现场环境中受到轻微打击。
保存所有图像会将尺寸存储在数据库中:
In [1]: for p in Photo.objects.all():
...: p.save()
答案 1 :(得分:1)
文档说https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.ImageField.height_field
<强> ImageField.height_field:强>
将是的模型字段的名称 自动填充,每次模型时图像的高度为 实例已保存。
模型save()必须自动填充height
和width