私はそのようなコードを持っています:
# ...
obj = Model.objects.get(pk=2342)
if foo:
obj.foo = 'bar'
if bar:
obj.bar = 'baz'
obj.save()
コードが実行されるたびにモデル インスタンスが保存されないようにするために、モデル インスタンスが変更されたかどうかを確認する良い方法はありますか?
私はそのようなコードを持っています:
# ...
obj = Model.objects.get(pk=2342)
if foo:
obj.foo = 'bar'
if bar:
obj.bar = 'baz'
obj.save()
コードが実行されるたびにモデル インスタンスが保存されないようにするために、モデル インスタンスが変更されたかどうかを確認する良い方法はありますか?
典型的なパターンは、次のようなことです。
model = Model.objects.get(pk=2342)
dirty = False
if foo:
model.foo = 'bar'
dirty = True
if bar:
model.bar = 'baz'
dirty = True
if dirty:
model.save()
「スナップショット」インスタンスと現在のモデル インスタンスをフィールドごとに比較するだけでsnapshot
、copy.copy(obj)
またはmodel_cls.objects.get(pk=obj.pk)
.
また、ダンプされたバージョンを単純に比較することもできます。
from django.core.serializers.json import Serializer
dump = Serializer.serialize([obj])
...
changed = dump == Serializer.serialize([obj])
通常、コードを微調整するのが最も簡単です。
obj = Model.objects.get(pk=2342) # 'obj' is better than 'model', IMO
changed = False
if foo:
...
obj.foo = 'bar'
changed = True
if bar:
...
obj.bar = 'baz'
changed = True
if changed:
obj.save()
Django はこのチェックを内部的に実行します。モデルが実際に変更されない限り、SQL クエリは実行されません。
アップデート
この答えは間違っています。私の悪い。これを別のものと混同しました。