2010-10-26 21 views
13

Django'da, ORM'nin MySQL veya PostgreSQL'deki ENUM türünü desteklemediğini anlıyorum, çünkü bu aslında bir MySQL uzantısıydı ve diğer DB türleri arasında taşınabilir değil. Yani iki seçenek, modelinize "seçimler" argümanını kullanmak veya bir yabancı anahtar referansı kullanmaktır.Django Modeli - yabancılara karşı seçenekler mi?

Bu yaklaşımların artıları ve eksileri nelerdir? devlet için ve ayrı tabloyu kullanarak karşı sebebi ne isimler, ve yabancı anahtarlar gibi bir şey için

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

Ancak: cinsiyet gibi bir şey için

, sana "seçimler", örneğin kullanmak istiyorsunuz varsayalım bu masaya?

state = models.ForeignKey(AustralianState) 

Biri diğerine karşı hangi koşullarda kullanırdınız?

Alkış,

cevap

3

Ayrıca, potansiyel seçeneklerin sayısı büyük olduğunda yabancı anahtarları da düşünmelisiniz. FK'yi ülke veya eyaletler için kullanmayı düşünmenin sebeplerinden biri budur. Aksi takdirde, kaynak kodunuzda çok fazla veriyi etkili bir şekilde kodlarsınız.

+0

Bu performans nedenleriyle mi? Hmm, bu yüzden çok sayıda devlet için, bir FK arama tablosunun gideceği yolun var mı? Ve sonra devletleri bir Django fikstüründe listeleyeceksin? – victorhooi

+0

Bu çok fazla performans nedeni değil - birkaç binden fazla seçeneğe bakmadığınız sürece performans muhtemelen tuple kıyasla daha iyidir - çoğunlukla bakım sorunudur. Aslında Django'nun, yerellerin altında yerleşik birçok ülke/eyalet alanı var. Ve sanırım başka dosyalara aktardığınız bir StateField oluşturabilirsiniz. Tam açıklama: Uygulamaların bazı bölümlerinde kullandığım ülke ve eyalet alanlarının aslında bunun yerine seçenekler kullanacağından eminim. Ancak FK de iyi bir seçim olurdu. –

+0

Bu durumda, ülke ve eyalet kısaltmasının, artan bir tam sayı yerine yabancı anahtar olarak kullanılmasını çok daha anlamlı buluyorum. –

14

Ben seçimler zamanla değişebilir olmaz seçimler kullanacağı Victor. İsterlerse, yeni modele sahip bir FK daha iyi olurdu.