1. ホーム
  2. python

[解決済み] django - 保存する前に古いフィールドと新しいフィールドの値を比較する

2023-08-20 12:02:42

質問

djangoのモデルで、保存する前にフィールドの新旧の値を比較する必要があります。

私は save() 継承を試してみましたが pre_save シグナルを使用しています。正しくトリガーされましたが、実際に変更されたフィールドのリストが見つからず、古い値と新しい値を比較することができません。方法はありますか?私は保存前のアクションの最適化のためにそれを必要とします。

ありがとうございます!

どのように解決するのですか?

非常に簡単な django の方法があります。

モデル init にある値をこのように記憶します。

def __init__(self, *args, **kwargs):
    super(MyClass, self).__init__(*args, **kwargs)
    self.initial_parametername = self.parametername
    ---
    self.initial_parameternameX = self.parameternameX

実際の例です。

授業で

def __init__(self, *args, **kwargs):
    super(MyClass, self).__init__(*args, **kwargs)
    self.__important_fields = ['target_type', 'target_id', 'target_object', 'number', 'chain', 'expiration_date']
    for field in self.__important_fields:
        setattr(self, '__original_%s' % field, getattr(self, field))

def has_changed(self):
    for field in self.__important_fields:
        orig = '__original_%s' % field
        if getattr(self, orig) != getattr(self, field):
            return True
    return False

そしてmodelformのsaveメソッドで

def save(self, force_insert=False, force_update=False, commit=True):
    # Prep the data
    obj = super(MyClassForm, self).save(commit=False)

    if obj.has_changed():

        # If we're down with commitment, save this shit
        if commit:
            obj.save(force_insert=True)

    return obj