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

Bor*_*ris 38 python django

我的模块中有一个字段用于保存对象的状态.到目前为止我用过:

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.


fij*_*ter 8

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

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)


Ser*_*eim 5

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