被Django的ImageField宽度和高度混淆

时间:2017-04-08 20:28:20

标签: django image

我已将图片widthheight字段添加到基于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添加到widthheight

    height = models.IntegerField(default=0)
    width = models.IntegerField(default=0)

现在,对于所有现有照片,两列都填充了零,如预期的那样。然而,我没想到的是Photo.objects.all()[0].width.height现在返回正确的非零值。为什么?我无法在documentation中找到有关此类行为的任何内容。

2 个答案:

答案 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()必须自动填充heightwidth