我有一個這樣的代碼:我如何知道django模型實例是否被修改?
# ...
obj = Model.objects.get(pk=2342)
if foo:
obj.foo = 'bar'
if bar:
obj.bar = 'baz'
obj.save()
有以找出是否模型實例是爲了防止各代碼運行時將其保存修改的好方法嗎?
我有一個這樣的代碼:我如何知道django模型實例是否被修改?
# ...
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()
Django在內部執行此檢查。一個sql查詢不會被解僱,除非模型實際上已經改變。
UPDATE
這個答案是錯的。我的錯。我把這與其他的東西混淆了。
只是將「快照」實例與當前模型實例逐字段進行比較,您可以獲得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()
+1。除非您有非常有說服力的理由,否則請將該支票留給Django。 –
我不這麼認爲。你能提供一些證據嗎?或者你是否將它混合在了檢查Django表單的'has_changed'中? – okm
我也不這麼認爲。你可以顯示在這行檢查處理[這裏](https://code.djangoproject.com/browser/django/trunk/django/db/models/base.py#L467)? – DrTyrsa