2011-11-10 16 views
22

Supponiamo di avere un campo di scelta nel mio modello di django che consiste in diverse scelte. Ora, in futuro, se avessi cambiato la scelta esistente (opzione) con un altro nome (scelta), allora cambierà anche i record esistenti nel modello con quella scelta (opzione)? Oppure Nella pagina di amministrazione devo impostare manualmente quella nuova opzione?ChoiceField in Django model

Come posso ottenere questo risultato?

risposta

79

ChoiceFields sono memorizzati nel database come i valori, così per fare un esempio da the documentation:

class Foo(models.Model): 
    GENDER_CHOICES = (
     ('M', 'Male'), 
     ('F', 'Female'), 
    ) 
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES) 

Il database memorizzerà 'M' e 'F', quindi se voi un giorno decide di rinominare quelli in questo modo *:

class Foo(models.Model): 
    GENDER_CHOICES = (
     ('M', 'Homme'), 
     ('F', 'Femme'), 
    ) 
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES) 

Quindi ovunque utilizzare i valori espanso 'Male' o 'F' ora avrà 'Homme' o 'Femme'.

Se si desidera modificare i valori stessi (ad es. "M" e "F"), è necessario aggiornare il database, quindi se si desidera modificare "M" in "H", allora si " d uso update:

Foo.objects.filter(gender = 'M').update(gender = 'H') 

a meno che non hai un buon motivo per, mi piacerebbe evitare di fare questo - dal momento che è necessario assicurarsi che il cambiamento GENDER_CHOICES e la query update sono fatto simultaneamente.

* E sì, questo so che questo è un modo stupido di fare traduzione!

Problemi correlati