2011-11-10 26 views
22

Załóżmy, że mam pole wyboru w moim modelu django, które składa się z kilku opcji. Teraz w przyszłości, jeśli zmienię istniejący wybór (opcja) z inną nazwą (wyborem), a następnie, czy istniejące rekordy w modelu z tym wyborem (opcja) również się zmienią? Lub na stronie administratora muszę ręcznie ustawić tę nową opcję?ChoiceField w Django model

Jak mogę to osiągnąć?

Odpowiedz

79

ChoiceFields są przechowywane w bazie danych jako wartości, tak aby wziąć przykład z the documentation:

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

Baza danych będzie przechowywać „M” i „F”, więc jeśli pewnego dnia zdecydujesz się zmienić nazwę tych jak ten *:

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

Następnie gdziekolwiek używasz rozszerzonym wartościach „mężczyzna” i „kobieta” będzie teraz „Homme” lub „Femme”.

Jeśli chcesz zmienić same wartości (np. "M" i "F"), musisz zaktualizować bazę danych, więc jeśli chcesz zmienić "M" na "H", wtedy " d użycie update:

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

chyba że masz dobry powód, by uniknąć w ten sposób - ponieważ trzeba upewnić się, że zmiana GENDER_CHOICES i zapytanie update są wykonywane równocześnie.

* Tak, wiem, że to głupi sposób na tłumaczenie!