Voglio garantire che un oggetto sia univoco e generare un errore quando un utente tenta di salvarlo (ad esempio tramite l'amministratore) se no? Per unico, intendo che alcuni degli attributi dell'oggetto potrebbero contenere gli stessi valori di altri oggetti, ma non possono TUTTI essere identici ai valori di un altro oggetto.DRY oggetti unici in Django
Se non mi sbaglio, posso fare questo in questo modo:
class Animal(models.Model):
common_name = models.CharField(max_length=150)
latin_name = models.CharField(max_length=150)
class Meta:
unique_together = ("common_name", "latin_name")
Ma poi ogni volta che refactoring del modello (ad esempio per aggiungere un nuovo campo, o per cambiare il nome di un campo esistente), Devo anche modificare l'elenco dei campi tra parentesi assegnato a unique_together. Con un modello semplice, va bene, ma con uno sostanziale, diventa una vera seccatura durante il refactoring.
Come evitare di dover ripetere la digitazione dell'elenco dei nomi dei campi nella parentesi unique_together? Esiste un modo per passare l'elenco dei campi del modello a una variabile e assegnare tale variabile a unique_together?
+1 - grande domanda. Non penso che tu possa, ma sono interessato a sentire le opinioni degli altri. –
+1 - È davvero interessante se qualcuno può trovare una soluzione piacevole. Ho provato ma non riuscivo a farlo funzionare tramite la riflessione, perché non puoi leggere le proprietà dalla classe Animal (che è ovvio perché Animal non è completamente definito in quel momento). – FlorianH
jtiai su irc: //irc.freenode.net/django si è gentilmente preso un po 'di tempo per discutere la domanda e mi ha suggerito di aggiungere la mia classe "AllUniqueModel", ereditare lo standard "Model" e rendere magica la metaclass per iniettare tutti i campi in unique_togerther dopo che sono stati elaborati dalla procedura di creazione standard. ' Non sono del tutto sicuro di cosa intendesse jtiai, ma suona come una soluzione più complicata di quanto speravo. – sampablokuper