2012-03-09 12 views
10

क्या Django में "समर्थन तालिकाओं" को संभालने में कोई सर्वोत्तम अभ्यास है?Django - हैंडलिंग "enum मॉडल"

मैं Field.choices नापसंद करता हूं, क्योंकि यह वास्तव में अखंडता को लागू नहीं करता है (यह चेक बाधाएं भी नहीं बनाता है), इसलिए मैं एक पूर्ण उड़ा मॉडल बनाना पसंद करता हूं (और अक्सर, मैं स्वयं समर्थन तालिका में अतिरिक्त फ़ील्ड जोड़ता हूं)।

अब, अगर मैं एक पूर्ण मॉडल का उपयोग करता हूं, तो मुझे लगता है कि तालिका सामग्री के लिए प्रारंभिक डेटा फ़िक्स्चर बनाने का सही तरीका है, लेकिन पंक्ति के उदाहरणों का नाम देने के लिए "सही तरीका" है। ..

class State(models.Model): 
    name = model.TextField() 

STATES = dict(
    NEW=State.objects.get(pk=0), 
    IN_PROGRESS=State.objects.get(pk=1), 
) 

... या ऐसा कुछ।

क्या आप उपयोग करते हैं?

+2

मैं अब इस 11 महीने पहले से है, लेकिन आप इस के लिए किसी विशेष अच्छा अभ्यास पता चला? यहां एक ही चीज़ पर आश्चर्यचकित होना। – blaze

उत्तर

8

यदि आप विकल्प विशेषता निर्दिष्ट करते हैं (जब आप उपयोगकर्ता रूपों के माध्यम से डेटा डालें/अपडेट करते हैं) Django ORM अखंडता की जांच करता है।

आप डेटाबेस स्तर पर सत्यापन तर्क सेट कर सकते हैं और डेटाबेस ENUM फ़ील्ड का उपयोग कर सकते हैं यदि आप इसका समर्थन करते हैं।

युपीडी:

class EnumField(models.Field): 

    def __init__(self, *args, **kwargs): 
     super(EnumField, self).__init__(*args, **kwargs) 
     if not self.choices: 
      raise AttributeError('EnumField requires `choices` attribute.') 

    def db_type(self): 
     return "enum(%s)" % ','.join("'%s'" % k for (k, _) in self.choices) 

GENDER_MALE = 'm' 
GENDER_FEMALE = 'f' 
GENDER_CHOICES = (
    (GENDER_MALE, 'Male'), 
    (GENDER_FEMALE, 'Female'), 
) 


class Person(models.Model): 
    name = models.CharField(max_length=50) 
    gender = EnumField(choices=GENDER_CHOICES) 
+2

मैं चाहता हूं कि बाधा डेटाबेस में हो, और "enums" अपने स्वयं के टेबल के साथ पूर्ण मॉडल बनें। असल में, मैं "पायथन" enum बनाने के लिए पाइथोनिक/Djangoish तरीके के बारे में सोच रहा हूँ। – alex

+0

मेरा उत्तर अपडेट किया गया – San4ez

+2

मैं अन्य/निर्दिष्ट भी सुझाव देता हूं! – Ashe