Attualmente sto codificando un sito in Django (perché non puoi mai imparare troppi framework!), E mi chiedo se c'è un modo per incrementare automaticamente un oggetto rispetto ad un oggetto correlato. Così, per esempio, dicono che ho un modello entry e un modello EntryVersion:C'è un modo per incrementare automaticamente un campo Django rispetto a una chiave esterna?
Entry
- titolo
- lumaca
EntryVersion
- ingresso (chiave esterna)
- version_number
- contenuto
Desidero incrementare automaticamente version_number
rispetto alla chiave esterna di entrata (in modo che una voce possa avere più versioni, a partire da una e spostandosi verso l'alto di una). Tuttavia, non sarà un vero incremento automatico, perché non sarà univoco nel database (potrebbero esserci molte versioni di voci con version_number = 1, solo una per una data Entry).
So che potrei aprire il mio amministratore e gestirlo lì, ma mi chiedevo se ci fosse un modo per far sì che l'amministratore di Django aumentasse automaticamente il numero di versione di uno ogni volta che veniva salvata una nuova versione.
Edit: codice specifico che ho usato (corretto per solo impostare il numero di versione al primo salvataggio)
risposta di Tiago aveva ragione, ma nell'interesse dei futuri utenti StackOverflow con dilemmi simili, ecco il codice specifico che ho usato:
def save(self, force_insert=False, force_update=False):
# Only modify number if creating for the first time (is default 0)
if self.version_number == 0:
# Grab the highest current index (if it exists)
try:
recent = EntryVersion.objects.filter(entry__exact=self.entry).order_by('-version_number')[0]
self.version_number = recent.version_number + 1
except IndexError:
self.version_number = 1
# Call the "real" save() method
super(EntryVersion, self).save(force_insert, force_update)
il trucco order_by
w/indice è quella che ho raccolte dalla documentazione Django qui:
http://docs.djangoproject.com/en/dev/topics/db/queries/#id4
Si noti che è necessario disporre di default=0
definito sul version_number
campo per far funzionare tutto questo.
Potrebbe esserci un modo migliore, ma questo sembra funzionare esattamente come avevo bisogno; si spera che anche gli altri lo trovino utile.
Grazie per condividere la vostra soluzione. – Giacomo
Quanto è sicura questa soluzione, date richieste concorrenti alla stessa voce? –
Non sono sicuro che io al 100% batti il tuo caso d'uso. Potresti farlo nel metodo di salvataggio della voce? –