Ci sono molti modi per risolvere il problema che hai descritto:
- Logica dell'applicazione
- Logica specifica della vista -- Se il comportamento è specifico di una singola vista, inserisci le modifiche nella vista.
- Logica specifica del modello -- Se il comportamento è specifico di un singolo modello, sostituisci il metodo save() per il modello.
- Logica del middleware -- Se il comportamento si riferisce a più modelli OPPURE deve essere avvolto attorno a un'applicazione esistente, puoi utilizzare Segnali pre-salvataggio/post-salvataggio per aggiungere ulteriori comportamenti senza modificare l'applicazione stessa.
- Procedure archiviate nel database -- Normalmente una possibilità, ma l'ORM di Django non li usa. Non portabile tra database.
- Trigger del database -- Non trasferibile da un database all'altro (o anche da una versione di un database a quella successiva), ma consente di controllare il comportamento condiviso su più applicazioni (possibilmente non Django).
Personalmente, preferisco usare l'override del metodo save() o usare un segnale Django. L'uso della logica specifica della vista può farti notare su applicazioni di grandi dimensioni con più viste degli stessi modelli.