我的模块中有一个用于保存对象状态的字段。 到目前为止我用过:
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 :(得分: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')