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

时间:2010-01-26 19:40:00

标签: python 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 {}。或者也许有一种完全不同的方法来解决这个问题?

由于

7 个答案:

答案 0 :(得分:38)

也许这个问题有助于您: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 :(得分:8)

我通常为这种情况做的是:

models.py

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

你可以试试enum包: http://pypi.python.org/pypi/enum/

答案 4 :(得分: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')

答案 5 :(得分: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')

答案 6 :(得分:0)

不要做所有这些事情。只需在views.py中进行如下更改

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

其中

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