È possibile eseguire questa operazione in un metodo save
sostituito. La cosa da ricordare è che le istanze del modello Django non sono gli oggetti del database vero e proprio, ma solo i loro valori vengono caricati da lì. Quindi puoi tornare facilmente al database prima di salvare il tuo oggetto corrente per ottenere i valori esistenti.
def save(self, *args, **kwargs):
if self.status == 'pending':
old_instance = MyClass.objects.get(pk=self.pk)
if old_instance.status == 'activated':
raise SomeError
super(MyModel, self).save(*args, **kwargs)
Attualmente non esiste un modo valido per restituire un messaggio di errore all'utente diverso dall'aumentare un'eccezione. È in corso un progetto Google Summer of Code per abilitare la "validazione del modello", ma non sarà pronto per alcuni mesi.
Se si desidera eseguire un'operazione simile nell'amministratore, il modo migliore è definire un ModelForm personalizzato con un metodo sostituito clean()
. Tuttavia, questa volta poiché questo è un modulo, hai già accesso ai vecchi valori senza colpire nuovamente il db. Un altro vantaggio è che è possibile restituire un errore di convalida del modulo all'utente.
fonte
2009-05-15 06:35:08
+1 - Mi stavo chiedendo la stessa cosa.Nel mio caso c'è un lavoro pesante che viene svolto con un metodo di salvataggio che è necessario solo se un campo in un particolare sottoinsieme di campi del modello è cambiato, e ho cercato un modo per verificare se questo è il caso . Grazie! –