我的模块中有一个字段用于保存对象的状态.到目前为止我用过:
ORDER_STATUS = ((0, 'Started'), (1, 'Done'), (2, 'Error'))
status = models.SmallIntegerField(choices=ORDER_STATUS)
Run Code Online (Sandbox Code Playgroud)
它很容易转换为一种方式:
def status_str(self): return ORDER_STATUS[self.status][1]
Run Code Online (Sandbox Code Playgroud)
问题在于更新时.我发现自己有这样的代码:
order.status = 2 # Error Status
Run Code Online (Sandbox Code Playgroud)
这非常糟糕,并且很难同步.我想解决方案类似于C的enum {}.或者也许有一种完全不同的方式来解决这个问题?
谢谢
Fel*_*ing 39
也许这个问题可以帮助你:通过choices = ... name设置Django IntegerField.
我引用接受的答案(带有调整;)):
把它放到你的班级(STATUS_CHOICES
将是交给choices
该领域选项的清单):
PENDING = 0
DONE = 1
STATUS_CHOICES = (
(PENDING, 'Pending'),
(DONE, 'Done'),
)
Run Code Online (Sandbox Code Playgroud)
那你可以做order.status = Order.DONE
.
请注意,您不必实现自己的方法来检索(可读)值,Django 自己提供方法get_status_display
.
我通常为这种情况做的是:
models.py
from static import ORDER_STATUS
status = models.PositiveSmallIntegerField(choices=ORDER_STATUS)
Run Code Online (Sandbox Code Playgroud)
static.py
ORDER_STATUS = ((0, 'Started'), (1, 'Done'), (2, 'Error'))
ORDER_STATUS_DICT = dict((v, k) for k, v in ORDER_STATUS)
Run Code Online (Sandbox Code Playgroud)
现在你可以这样做:
from static import ORDER_STATUS_DICT
order.status = ORDER_STATUS_DICT['Error']
Run Code Online (Sandbox Code Playgroud)