2012-05-02 58 views

回答

3

的典型模式是做這樣的事情:

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() 
0

Django在內部執行此檢查。一個sql查詢不會被解僱,除非模型實際上已經改變。

UPDATE

這個答案是錯的。我的錯。我把這與其他的東西混淆了。

+0

+1。除非您有非常有說服力的理由,否則請將該支票留給Django。 –

+3

我不這麼認爲。你能提供一些證據嗎?或者你是否將它混合在了檢查Django表單的'has_changed'中? – okm

+4

我也不這麼認爲。你可以顯示在這行檢查處理[這裏](https://code.djangoproject.com/browser/django/trunk/django/db/models/base.py#L467)? – DrTyrsa

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()  
相關問題