Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
被Django'所迷惑;图像字段宽度和高度_Django_Image - Fatal编程技术网

被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和。。。你检查了吗?是的,看起来你是对的:)它还帮助我定位并解决了我项目中的一个时间浪费问题,谢谢!