2010-01-26 12 views
31

मेरे पास मेरे मॉड्यूल में एक फ़ील्ड है जिसका उपयोग ऑब्जेक्ट की स्थिति को पकड़ने के लिए किया जाता है। अब तक मैं का इस्तेमाल किया है:Django: मॉड्यूल में "स्थिति" फ़ील्ड को लागू करने का सबसे अच्छा तरीका

ORDER_STATUS = ((0, 'Started'), (1, 'Done'), (2, 'Error')) 
status = models.SmallIntegerField(choices=ORDER_STATUS) 

इसके कन्वर्ट करने के लिए आसान एक ही रास्ता:

def status_str(self): return ORDER_STATUS[self.status][1] 

समस्या है जब अद्यतन करने है। मुझे अपने आप को इस तरह का कोड मिल रहा है:

order.status = 2 # Error Status 

जो काफी भयानक है और सिंक्रनाइज़ करने के लिए वास्तव में कठिन हो जाता है। मुझे लगता है कि एक समाधान सी के enum {} के समान कुछ होगा। या शायद इस समस्या से निपटने के लिए एक अलग तरीका है?

धन्यवाद

+0

संभव डुप्लिकेट [विकल्पों के द्वारा सेट Django IntegerField = ... नाम] (http://stackoverflow.com/questions/1117564/set-django-integerfield-by-choices-name) –

उत्तर

31

हो सकता है कि इस सवाल का आप में मदद करता है: Set Django IntegerField by choices=… name
मैं स्वीकार किए जाते हैं जवाब से बोली (समायोजन के साथ;)):
अपनी कक्षा में इस रखो (STATUS_CHOICES) की सूची है कि क्षेत्र की choices विकल्प को सौंप दिया है हो जाएगा:

PENDING = 0 
DONE = 1 
STATUS_CHOICES = (
    (PENDING, 'Pending'), 
    (DONE, 'Done'), 
) 

तो फिर तुम कर सकते हैं order.status = Order.DONE करें।


नोट कि आप नहीं (पठनीय) मूल्य, जैंगो provides the method get_status_display itself प्राप्त करने देती है खुद विधि को लागू करने की है।

+1

अपडेट किया गया लिंक: https://docs.djangoproject.com/en/1.6/ref/models/instances/#django.db.models.Model। get_FOO_display – steps

+1

लिंक जो 2016 में काम करता है: https://docs.djangoproject.com/en/1.9/topics/db/models/#field-options –

2

आप enum पैकेज की कोशिश कर सकते हैं: http://pypi.python.org/pypi/enum/

+0

मुझे नहीं पता कि Django डेटाबेस में इन चीजों का लगातार काम कैसे करेगा। क्या इस उत्तर को उस विषय पर बढ़ाया जा सकता है? – jonalv

+0

संदर्भ के लिए: https://github.com/5monkeys/django-enumfield – antonagestam

2

आपको अपनी status_str विधि की आवश्यकता नहीं है - Django स्वचालित रूप से get_status_display() प्रदान करता है जो वास्तव में वही काम करता है।

उल्टा करने के लिए, तो आप इस इस्तेमाल कर सकते हैं:

def set_order_status(self, val): 
    status_dict = dict(ORDER_STATUS) 
    self.status = status_dict[val][0] 

अब आप कर सकते हैं:

order.set_order_status('Done') 
+0

अच्छा विचार, लेकिन _ ** गलत ** _। पूछताछकर्ता द्वारा परिभाषित 'ORDER_STATUS' का उपयोग करके' status_dict' को '{0: 'प्रारंभ' पर सेट किया जाएगा, 1: 'संपन्न', 2: 'त्रुटि'}'। ध्यान दें कि शब्दकोश कुंजी संख्याएं हैं, तार नहीं। जैसा कि आप त्रुटि में परिणाम सुझाते हैं, विधि को कॉल करना, 'KeyError:' संपन्न '। 'Status_dict' को' status_dict = {x [1]: x [0] x में ORDER_STATUS} में और 'self.status'' को self.status = status_dict [val] 'में बदलें। –

8

क्या मैं आमतौर पर इस स्थिति के लिए क्या है:

models.py

from static import ORDER_STATUS  
status = models.PositiveSmallIntegerField(choices=ORDER_STATUS) 

स्थिर।py

ORDER_STATUS = ((0, 'Started'), (1, 'Done'), (2, 'Error')) 
ORDER_STATUS_DICT = dict((v, k) for k, v in ORDER_STATUS) 

अब आप कर सकते हैं:

from static import ORDER_STATUS_DICT 
order.status = ORDER_STATUS_DICT['Error'] 
0

हो सकता है, मॉडल पर एक विधि छड़ी की तरह:

def status_code(self, text): 
    return [n for (n, t) in self.ORDER_STATUS if t == text][0] 

तो फिर तुम करना चाहते हैं:

order.status = order.status_code('Error') 
5

यह एक बहुत ही देर का जवाब है, हालांकि पूर्णता के लिए मुझे उल्लेख करना चाहिए कि django- मॉडल-यूटिल में पहले से ही StatusField और StatusModel बेहतर है। मैं हर जगह इसका उपयोग कर रहा हूं मुझे एक स्थिति की आवश्यकता है।

+1

एक और लाइब्रेरी जो न्यूनतम बॉयलरप्लेट के साथ एक समान विकल्प प्रदान करती है वह है 'django-options' https://github.com/bigjason/django-choices –

0

उन सभी चीजों views.py में परिवर्तन करने के रूप में

context['value'] = Model_name.objects.order_by('-choice') 

इस प्रकार नहीं करते जहां

choice = ('pending','solved','closed') 
की
संबंधित मुद्दे