被Django'所迷惑;图像字段宽度和高度
我已将图像被Django'所迷惑;图像字段宽度和高度,django,image,Django,Image,我已将图像宽度和高度字段添加到基于ImageField的模型中: class Photo(models.Model): height = models.IntegerField() width = models.IntegerField() image = models.ImageField( upload_to=settings.PHOTO_UPLOAD_TO, height_field='height', width_f
宽度
和高度
字段添加到基于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
现在返回正确的非零值。为什么?我在中找不到关于这种行为的任何信息。文档中说
ImageField.height\u字段:
将创建的模型字段的名称
自动填充,每次模型
实例已保存
model save()必须同时自动填充高度和宽度。Django的ImageField.update\u dimension\u fields方法似乎正在发挥神奇的作用。代码中的注释表示: 更新字段的宽度和高度字段(如果已定义) 该方法连接到模型的post_init信号进行更新 实例化模型实例后的维度。然而,尺寸 如果维度字段已填充,则不会更新。这 避免从中加载对象时不必要的重新计算 数据库 可以使用
force=True
强制更新维度,这就是
ImageFileDescriptor.\uuuu set\uuuu
调用此方法
因此,在实例化模型时,update\u dimension\u fields
从图像文件中读取维度并将其存储在实例中。这将在实际环境中引起一点影响
保存所有图像将在数据库中存储尺寸:
In [1]: for p in Photo.objects.all():
...: p.save()
但我没有保存任何东西,这就是重点。这些图像已经在数据库中。高度和宽度列都是零,单位为DB。我正在检索数据,而不是保存数据。还是我遗漏了什么?在迁移过程中,将默认值设置为0可能会触发保存权限!我可能错了,但我真的很怀疑。迁移会更改数据库方案,但据我所知,迁移不会触发对现有行的保存。这就是为什么我对现有照片的宽度和高度都为零的原因。你知道吗?我刚刚经历了和你完全一样的情况。现在发现每个现有图像都有正确的
宽度
和高度
值。@Nifled,不,我没有。@Nifled,现在有答案了。看起来这是正确的答案,但我会在接受之前检查它。谢谢,+1。@texnic和。。。你检查了吗?是的,看起来你是对的:)它还帮助我定位并解决了我项目中的一个时间浪费问题,谢谢!