COBAKURA.COM

Django 特定のフィールドが更新されたかを判定する方法

Djangoのsaveメソッド内で、「指定のフィールドの値が更新されたかどうか」を判定する方法。

models.py
def save(self, *args, **kwargs):
    # DBに保存しているデータを取得
    old_obj = self._meta.model.objects.get(id=self.id)
    if old_obj.field_name != self.field_name:
        # 値が更新されたときの処理

field_name の所に対象のフィールド名を指定します。

そもそもデータが新規作成されたか更新されたかは、saveメソッド内で self._state.adding の値を参照することで判定できます。

こんな感じで pre_save を使う方法もあります。対象のモデル以外にも影響を及ぼすコードを書く場合は pre_save の方でやると良いかも。

@receiver(pre_save, sender=MyModel)
def hoge(sender, instance, **kwargs):
    try:
        old_obj = sender.objects.get(pk=instance.pk)
    except sender.DoesNotExist:
        # 新規作成された時の処理
    else:
        if old_obj.field_name != instance.field_name:
            # 値が更新された時の処理

おすすめ記事

2024/1/19

Celeryタスクを更新したときにDockerコンテナを自動リスタートする

2023/8/10

Djangoでエポック秒(unix秒)をテンプレートで表示

2023/7/5

Django OneToOneFieldが存在するかをチェックする方法