1. ホーム
  2. python

[解決済み] Djangoです。モデルへの保存をオーバーライドする

2022-04-23 18:49:24

質問

モデルを保存する前に、写真のサイズを変更しています。しかし、新しい画像が追加されたか、説明文が更新されたかを確認し、モデルを保存するたびに再スケーリングすることを省略するにはどうしたらよいでしょうか。

class Model(model.Model):
    image=models.ImageField(upload_to='folder')
    thumb=models.ImageField(upload_to='folder')
    description=models.CharField()


    def save(self, *args, **kwargs):
        if self.image:
            small=rescale_image(self.image,width=100,height=100)
            self.image_small=SimpleUploadedFile(name,small_pic)
        super(Model, self).save(*args, **kwargs)

新しい画像が読み込まれたときや画像が更新されたときだけ再スケールしたいのですが、descriptionが更新されたときは再スケールしません。

どうすればいいですか?

いくつか考えてみました。

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

        # Or put whole logic in here
        small = rescale_image(self.image,width=100,height=100)
        self.image_small=SimpleUploadedFile(name,small_pic)

    def get_image(self):
        return self._image

    image = property(get_image, set_image)

    # this is not needed if small_image is created at set_image
    def save(self, *args, **kwargs):
        if getattr(self, '_image_changed', True):
            small=rescale_image(self.image,width=100,height=100)
            self.image_small=SimpleUploadedFile(name,small_pic)
        super(Model, self).save(*args, **kwargs)

すべての擬似自動化された django ツール (例: ModelForm, contrib.admin など) とうまく連携できるかどうかはわかりません。