保存時にフィールドが変更されたかどうかを確認するにはどうすればよいですか? 質問する

保存時にフィールドが変更されたかどうかを確認するにはどうすればよいですか? 質問する

私のモデルでは次のようになります:

class Alias(MyBaseModel):
    remote_image = models.URLField(
        max_length=500, null=True,
        help_text='''
            A URL that is downloaded and cached for the image.
            Only used when the alias is made
        '''
    )
    image = models.ImageField(
        upload_to='alias', default='alias-default.png',
        help_text="An image representing the alias"
    )

    
    def save(self, *args, **kw):
        if (not self.image or self.image.name == 'alias-default.png') and self.remote_image :
            try :
                data = utils.fetch(self.remote_image)
                image = StringIO.StringIO(data)
                image = Image.open(image)
                buf = StringIO.StringIO()
                image.save(buf, format='PNG')
                self.image.save(
                    hashlib.md5(self.string_id).hexdigest() + ".png", ContentFile(buf.getvalue())
                )
            except IOError :
                pass

これは、変更を初めて行う場合に最適ですremote_image

誰かがエイリアスを変更したときに、新しいイメージを取得するにはどうすればよいでしょうかremote_image? また、リモート イメージをキャッシュするより良い方法はありますか?

ベストアンサー1

__init__基本的に、メソッドをオーバーライドしてmodels.Model、元の値のコピーを保持します。これにより、別の DB 検索を実行する必要がなくなります (これは常に良いことです)。

    class Person(models.Model):
        name = models.CharField()

        __original_name = None

        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.__original_name = self.name

        def save(self, force_insert=False, force_update=False, *args, **kwargs):
            if self.name != self.__original_name:
                # name changed - do something here

            super().save(force_insert, force_update, *args, **kwargs)
            self.__original_name = self.name

おすすめ記事