2012-05-02 14 views

Respuesta

3

El patrón típico es hacer algo como:

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 realiza esta comprobación internamente. Una consulta sql no se activará a menos que el modelo realmente haya cambiado.

ACTUALIZACIÓN

Esta respuesta es incorrecta. Mi error. Confundí esto con algo más.

+0

+1. Deje ese cheque a Django a menos que tenga razones muy convincentes para hacerlo. –

+3

No lo creo. ¿Puedes proporcionar alguna prueba? ¿O lo has mezclado con la verificación 'has_changed' del formulario de Django? – okm

+4

Yo tampoco lo creo. ¿Puede mostrar en qué línea se maneja este cheque [aquí] (https://code.djangoproject.com/browser/django/trunk/django/db/models/base.py#L467)? – DrTyrsa

1

Simplemente diferencie la instancia de "instantánea" con la instancia del modelo actual campo por campo, puede obtener el snapshot a través de copy.copy(obj) o model_cls.objects.get(pk=obj.pk).

También puede simplemente comparar las versiones objeto de dumping:

from django.core.serializers.json import Serializer 
dump = Serializer.serialize([obj]) 
... 
changed = dump == Serializer.serialize([obj]) 

Normalmente, modificar su código es más fácil:

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()  
Cuestiones relacionadas