首页  >  文章  >  后端开发  >  何时覆盖 Django 模型保存以调整图像大小

何时覆盖 Django 模型保存以调整图像大小

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-22 21:09:03412浏览

When to Override Django Model Saving for Image Resizing

针对特定情况覆盖 Django 模型保存

在 Django 中,模型中的 save() 方法负责将数据持久保存到数据库。但是,在某些情况下,您可能希望根据特定条件修改此行为。其中一种情况是仅在新添加或更新图像时重新缩放图像。

问题:

在包含图像、缩略图和描述字段的模型中,您仅当创建或修改主图像(image)时才需要调整大小并存储缩略图(thumbnail)。更新描述字段不应触发图像大小调整。

解决方案:

要实现此目的,您可以使用检查的自定义属性覆盖默认的 save() 方法对于图像字段中的更改:

<code class="python">class Model(model.Model):
    _image = models.ImageField(upload_to='folder')
    thumb = models.ImageField(upload_to='folder')
    description = models.CharField()

    def set_image(self, val):
        self._image = val
        self._image_changed = True

    def get_image(self):
        return self._image

    image = property(get_image, set_image)

    def save(self, *args, **kwargs):
        if getattr(self, '_image_changed', True):
            small = rescale_image(self.image, width=100, height=100)
            self.thumb = SimpleUploadedFile(name, small_pic)
        super(Model, self).save(*args, **kwargs)</code>

工作原理:

  • set_image() 方法更新 _image 字段并将标志 _image_changed 设置为True。
  • get_image() 方法返回 _image 字段的当前值。
  • image 属性包装了 set_image() 和 get_image() 方法以提供一致的接口。
  • 在重写的 save() 方法中,检查 _image_changed 标志。如果为 True,则意味着图像已更改或添加。
  • 在这种情况下,缩略图会重新缩放。
  • 调用 super() 方法将模型保存到数据库中重新缩放的缩略图(如有必要)和更新的描述。

以上是何时覆盖 Django 模型保存以调整图像大小的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn