2012-08-26 10 views
6

Grazie in anticipo. Ho creato un modello in Django, in cui ha un titolo, un URL e un campo per gli ordini. Ora ho impostato il valore predefinito di quel campo di ordinazione come ZERO. Il mio requisito è che questo valore di defult debba essere cambiato in current highest Ordering number + 1. Posso farlo in Admin Inteface?Come impostare il valore predefinito di un campo di ordinazione +1 del valore più alto in Django

class FooterLinks(models.Model): 
    title = models.CharField(_("Title"), max_length=200, null = True, blank = True) 
    link = models.CharField(_("Link"), max_length = 200) 
    order = models.IntegerField(_("Sort Order"), default=0) 
+0

Stai parlando di [AutoField] (https://docs.djangoproject.com/en/1.4/ref/ modelli/campi/# AutoField)? – soon

+0

@soon possiamo usare AutoField per questo tipo di scopi? Sono usati come chiavi primarie, giusto? Intendo un campo diverso con autoincrementing, ma modificabile e non dovrebbe essere un campo unico –

risposta

2
from django.db.models import Max 
new_default = FooterLinks.objects.all().aggregate(Max('order'))['order__max']+1 
FooterLinks.objects.filter(order=0).update(order=new_default) 

Per rendere permanente la modifica, o fare una migrazione di database con il Sud; o come suggerito da danihp sovrascrive il metodo di salvataggio.

Tuttavia, notare che se la tabella diventa molto grande, sarebbe meglio implementare questa logica come trigger sul database.

Edit:

No, si dovrebbe eseguire questo una sola volta e sarebbe aggiornare tutte le voci nel database - idealmente si dovrebbe farlo durante le normali finestre di inattività del sistema/manutenzione.

Per regolare il valore nella casella di testo, è necessario aggiornare il valore predefinito assegnato al modello. Si noti che default può assumere un valore o un richiamabile (in altre parole, un metodo). Ogni volta che il campo viene reso, verrà chiamato il metodo.

È possibile utilizzare questo per assicurarsi che il valore predefinito venga sempre calcolato fornendo un metodo come predefinito.

+0

funzionerà solo dopo aver salvato una voce, giusto? Ho bisogno che il valore Incrementato sia nella Casella di testo mentre aggiungo una nuova voce nel Pannello di amministrazione? Come lo posso fare? –

2

Ispirato dalla risposta di Burhan, sono stato in grado di risolvere un mio problema, simile al tuo.

Quindi per il vostro problema: Nel mio models.py creare il callable get_new_default

from django.db.models import Max 

def get_new_default(): 
    new_order_default = FooterLinks.objects.all().aggregate(Max('order'))['order__max']+1 
    return new_order_default 

class FooterLinks(models.Model): 
    order = models.CharField(_("Sort Order"), default = get_new_default) 

Questo incolla il nuovo valore massimo ordine nella casella di testo e mantiene il campo modificabile.


--- !! Modifica !! ---

Questo solleva un problema, quando si ripristina il database, poiché non ci sono oggetti con cui calcolare il massimo. La correzione è quello di contare tutti gli oggetti trovati e nel caso in cui non ne esistono di default impostata a 1:

from django.db.models import Max 

    def get_new_default(): 
     if FooterLinks.objects.all().count() == 0: 
      new_order_default = 1 
     else: 
      new_order_default = FooterLinks.objects.all().aggregate(Max('order'))['order__max']+1 
     return new_order_default 

    class FooterLinks(models.Model): 
     order = models.CharField(_("Sort Order"), default = get_new_default) 

Problemi correlati