5

私はそのようなコードを持っています:

# ...
obj = Model.objects.get(pk=2342)
if foo:
    obj.foo = 'bar'
if bar:
    obj.bar = 'baz'
obj.save()

コードが実行されるたびにモデル インスタンスが保存されないようにするために、モデル インスタンスが変更されたかどうかを確認する良い方法はありますか?

4

4 に答える 4

4

典型的なパターンは、次のようなことです。

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()
于 2012-05-02T14:27:28.693 に答える
1

「スナップショット」インスタンスと現在のモデル インスタンスをフィールドごとに比較するだけでsnapshotcopy.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()    
于 2012-05-02T14:09:14.253 に答える
0

Django はこのチェックを内部的に実行します。モデルが実際に変更されない限り、SQL クエリは実行されません。

アップデート

この答えは間違っています。私の悪い。これを別のものと混同しました。

于 2012-05-02T12:33:51.160 に答える