2011-01-15 13 views
11

एक क्षेत्र को देखते हुए;Django मॉडल फ़ील्ड विकल्प - क्या कोई निर्देश बेहतर नहीं होगा?

domain_status_choices = (
    (1,'Live') 
    (2,'Offline') 
    (3,'Dev') 
) 
status = models.SmallIntegerField(choices=domain_status_choices) 

मैं जानता हूँ कि मैं प्राप्त कर सकते हैं और संख्यात्मक प्रस्तुति की स्थापना की और get_status_display() का उपयोग पाठ लेबल पाने के लिए। लेकिन यदि कोई उपयोगकर्ता status=Offline पोस्ट करता है तो इसे सहेजने के लिए मुझे संख्यात्मक मूल्य कैसे प्राप्त हो सकता है? मैं भी उस संख्या या पाठ मानों को सत्यापित करने में सक्षम होना चाहता हूं सूची में हैं।

मेरे लिए यह एक नियम का उपयोग करने के लिए और अधिक समझ में आता है। यहां मेरी वर्तमान विधि है;

domain_status_choices = { 
    1: 'Live', 
    2: 'Offline', 
    3: 'Dev', 
} 
status = models.SmallIntegerField(choices=domain_status_choices.iteritems()) 
... 
if input1 not in domain_status_choices.keys(): print "invalid" 
if input2 not in domain_status_choices.items(): print "invalid" 
status = [k for k, v in domain_status_choices.iteritems() if v == input3][0] 

क्या कोई बेहतर तरीका है? आमतौर पर टुपल्स का एक ट्यूपल क्यों उपयोग किया जाता है?

+0

आप उपयोग के इस मामले collections.OrderedDict का उपयोग कर की कोशिश की? (विकल्पों के क्रम को संरक्षित करने के लिए।) Http://pymotw.com/2/collections/ordereddict.html –

उत्तर

13

मुझे विश्वास है कि एक dict की चाबियाँ क्रमबद्ध करने की गारंटी नहीं है (जब तक आप स्पष्ट रूप से OrderedDict का उपयोग नहीं करते)। यही है, आप अपने संस्करण के साथ "ऑफ़लाइन", "देव", "लाइव" विकल्प प्राप्त कर सकते हैं।

dict.items पर

कार्यान्वयन ध्यान दें:

कुंजी और मूल्यों एक मनमाना आदेश जो गैर यादृच्छिक है, अजगर कार्यान्वयन में भिन्न होती है, और सम्मिलन और विलोपन के शब्दकोश के इतिहास पर निर्भर करता है में सूचीबद्ध हैं।

+0

यहां एक विचार है, मेरे मामले में संख्यात्मक कुंजी के साथ मैं एक सूची का उपयोग कर सकता हूं? (tuples की एक सूची नहीं) या, अगर मैं आदेश के बारे में चिंतित नहीं हूं तो मैं इस विधि से चिपक सकता हूं। – Jake

+0

पाइथन कैसे काम करता है, इसके लिए धन्यवाद, आप जो कुछ भी चाहते हैं उसे फ़ील्ड के 'विकल्प' में जो कुछ भी आप चाहते हैं उसे बनाने के लिए स्वतंत्र हैं। यदि आप मुख्य रूप से किसी अन्य तरीके से विकल्पों का उपयोग करते हैं, तो मुझे उस सूची/dict/को परिवर्तित करने के साथ कुछ भी गलत नहीं दिखता है, जो इसे ' फ़ील्ड (विकल्प =)' (यानी यदि आपके लिए 'iteritems' काम करता है) कोई बात नहीं)। मुद्दा बस है: Django मानता है कि विकल्पों का क्रम मनमाने ढंग से नहीं होना चाहिए। – vicvicvic

3

@ vicvicvic के जवाब पर मेरी टिप्पणी पर विस्तार:

t = [ 'Live', 'Offline', 'Dev', ] 
status = models.SmallIntegerField(choices=[(i,t[i]) for i in range(len(t))]) 
... 
if not 0 <= int(input1) < len(t): print "invalid" 
if input2 not in t: print "invalid" 
status = t.index(input2) 
+3

पाइथोनिसिटी को बढ़ाने के लिए गणना करें: '[(i, v) i, v में enumerate (t)]' – TryPyPy

+4

'केवल गणना (टी) ' – Jake

संबंधित मुद्दे