Django:在模块中实现“状态”字段的最佳方式

问题描述:

我的模块中有一个字段用于保存对象的状态。 到目前为止,我已经使用: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://*.com/questions/1117564/set-django-integerfield-by-choices-name) – 2012-03-29 16:59:28

也许这个问题可以帮助你: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

你可以尝试枚举包: 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

你不需要你的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

我通常这种情况做的是:

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'] 

也许贴在模型的方法,如:

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

然后,你会怎么做:

​​

这是一个非常晚的答案,但是为了完整性,我应该提到django- model-utils已经包含一个StatusField,甚至更好一个StatusModel。我在任何需要有状态的地方使用它。

+1

另一个提供最小样板类似选项的库是'django-choices' https://github.com/bigjason/django-choices – 2016-03-29 18:14:16

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

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

其中

choice = ('pending','solved','closed')