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 {}。或者也许有一个完全不同的方式来解决这个问题?
感谢
也许这个问题可以帮助你: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。
更新后的链接:https://docs.djangoproject.com/en/1.6/ref/models/instances/#django.db.models.Model。 get_FOO_display – steps 2014-03-13 11:39:54
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/
我不明白这些东西如何坚持到Django数据库将工作。这个答案可以延长这个话题吗? – jonalv 2016-03-22 10:30:08
仅供参考: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')
不错的主意,但_ **错误** _。使用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。我在任何需要有状态的地方使用它。
另一个提供最小样板类似选项的库是'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')
的
可能重复[通过选择设置Django的IntegerField = ...名称] (http://*.com/questions/1117564/set-django-integerfield-by-choices-name) – 2012-03-29 16:59:28