Modifica della risposta di cui sopra ... prendendo la funzione brillante da Dominik Szopa e cambiarla sarà risolvere il change detection rapporto: Usare questo:
def get_changes_between_models(model1, model2, excludes = []):
changes = {}
for field in model1._meta.fields:
if not (field.name in excludes):
if field.value_from_object(model1) != field.value_from_object(model2):
changes[field.verbose_name] = (field.value_from_object(model1),
field.value_from_object(model2))
return changes
Poi nel codice si può dire (evitare try/tranne che per motivi di prestazioni):
if (self.id):
old = MyModel.Objects.get(pk=self.id)
changes = get_changes_between_models(self, old)
if (changes):
# Process based on what is changed.
Se si esegue questa operazione a livello di "modello", non è possibile salvare la query aggiuntiva. I dati sono già stati modificati dal momento in cui si raggiunge il punto "Salva". Il mio primo post, quindi perdonami se sembro un idiota.
Grazie per il suggerimento su 'Field.value_from_object()'! Apparentemente fornisce un modo coerente di confrontare i valori. Bello! –
Per rendere questa risposta più leggibile, precisa e chiara, cambierei "model1" in "model_instance_1" e "model2" in "model_instance_2". E il nome del metodo dovrebbe forse essere "get_changes_between_model_instances". Non sono sicuro che ci sia un modo migliore nelle versioni più recenti di Django ma sto usando 1.8 attualmente e questa risposta funzionerà per me. – jenniwren