2010-01-26 123 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 

這是相當可怕的,很難同步。我想解決方案將類似於C的enum {}。或者也許有一個完全不同的方式來解決這個問題?

感謝

+0

可能重複[通過選擇設置Django的IntegerField = ...名稱] (http://stackoverflow.com/questions/1117564/set-django-integerfield-by-choices-name) – 2012-03-29 16:59:28

回答

31

也許這個問題可以幫助你:Set Django IntegerField by choices=… name
我從接受的答案引用(與調整;)):
將這個變成你的類(STATUS_CHOICES將被移交給現場的choices選項列表):

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

然後你就可以做order.status = Order.DONE


注意必須實現一個自己的方法來檢索(讀取)值,Django的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 2014-03-13 11:39:54

+1

2016年的鏈接:https://docs.djangoproject.com/en/1.9/topics/db/models/#field-options – 2016-03-24 16:56:39

2

你可以嘗試枚舉包: http://pypi.python.org/pypi/enum/

+0

我不明白這些東西如何堅持到Django數據庫將工作。這個答案可以延長這個話題嗎? – jonalv 2016-03-22 10:30:08

+0

僅供參考:https://github.com/5monkeys/django-enumfield – antonagestam 2017-07-31 14:24:00

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

不錯的主意,但_ **錯誤** _。使用asker定義的'ORDER_STATUS'會將'status_dict'設置爲'{0:'Started',1:'Done',2:'Error'}'。請注意,字典鍵是數字,而不是字符串。按照您的建議調用該方法會導致錯誤:「KeyError:'Done''。將'status_dict'改爲'status_dict = {x [1]:x [0] for ORDER_STATUS}'''self.status'改爲'self.status = status_dict [val]'。 – 2016-02-24 13:18:30

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] 

然後,你會怎麼做:

​​
5

這是一個非常晚的答案,但是爲了完整性,我應該提到django- model-utils已經包含一個StatusField,甚至更好一個StatusModel。我在任何需要有狀態的地方使用它。

+1

另一個提供最小樣板類似選項的庫是'django-choices' https://github.com/bigjason/django-choices – 2016-03-29 18:14:16

0

不要做那些things.just做出改變views.py如下

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

其中

choice = ('pending','solved','closed') 
相關問題