2010-10-26 13 views
13

Rozumiem, że w Django ORM nie obsługuje typu ENUM w MySQL lub PostgreSQL, ponieważ był to pierwotnie rozszerzenie MySQL i nie jest przenośny w innych typach DB. Więc dwie opcje to użycie argumentu "choice" dla twojego modelu lub użycie referencji klucza obcego.Model Django - wybory kontra klucz obcy?

Jakie są plusy i minusy tych metod?

Na coś takiego jak płeć, zakładam, że używasz „wybory”, np:

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

jednak na coś takiego stanu nazwy, jakie są powodem i przed użyciem oddzielnego stołu i kluczy obcych do tego stołu?

state = models.ForeignKey(AustralianState) 

W jakich okolicznościach używałbyś jeden kontra drugi?

Cheers, Victor

Odpowiedz

3

Należy również wziąć pod uwagę klucze obce, gdy liczba potencjalnych opcji jest duża. To jeden z powodów, dla których warto rozważyć użycie FK dla krajów lub stanów. W przeciwnym razie skutecznie kodujesz wiele danych w kodzie źródłowym.

+0

Czy to ze względu na wydajność? Hmm, więc dla wielu stanów, przypuszczam, że tablica wyników FK jest drogą do zrobienia? A następnie po prostu listę stanów w urządzeniach Django? – victorhooi

+0

To nie tyle powody, dla których wydajność jest lepsza z krotkami, chyba że szukasz więcej niż kilka tysięcy opcji - to głównie problem z konserwacją. W rzeczywistości Django ma wiele pól kraju/stanu wbudowanych w ustawienia regionalne, jak sądzę. I przypuszczam, że mógłbyś stworzyć StateField, który zaimportowałeś do innych plików. Pełne ujawnienie: jestem pewien, że pola kraju i stanu, których używam w niektórych częściach moich aplikacji, faktycznie wykorzystują wybory. Ale FK również byłby dobrym wyborem. –

+0

Dodałbym, że w tym przypadku użycie skrótu kraju i stanu jako klucza obcego, zamiast zwiększania liczby całkowitej, ma dużo większy sens. –

14

użyłbym wyborów, gdzie wybory nie zmieniają się w czasie. Gdyby tak było, FK z nowym modelem byłoby lepsze.