2009-02-07 8 views
19

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.

+0

Grazie per condividere la vostra soluzione. – Giacomo

+1

Quanto è sicura questa soluzione, date richieste concorrenti alla stessa voce? –

+0

Non sono sicuro che io al 100% batti il ​​tuo caso d'uso. Potresti farlo nel metodo di salvataggio della voce? –

risposta

8

Si può fare questo:

def save(self, force_insert=False, force_update=False): 
    #if self.id is None: 
    self.version_number += 1 

    super(EntryVersion, self).save(force_insert, force_update) # Call the "real" save() method. 

che proviene direttamente da qui:

http://docs.djangoproject.com/en/dev/topics/db/models/#overriding-predefined-model-methods

+0

Grazie! Ovviamente avrò bisogno di aggiungere un po 'più di logica rispetto all'incremento del numero di versione (dal momento che presumibilmente non sarà impostato sull'ultimo numero di versione), ma penso che sia sicuramente la direzione che devo seguire; grazie anche per il link, non l'ho notato nei documenti. –

+0

Ho fatto qualcosa di simile in un progetto, ma alla fine ho inserito la logica all'interno della vista, perché era più semplice e c'era solo un metodo che può creare il mio oggetto. – Tiago

+0

Potrei finire per migrare alla vista, ma in particolare volevo essere in grado di avere questo Just Work nell'amministratore adesso (dato che sono nelle fasi di testing molto iniziali e non ho ancora nessuna installazione di visualizzazione delle modifiche). Grazie ancora! –

Problemi correlati