【问题标题】:Django: Best way to implement "status" field in modulesDjango:在模块中实现“状态”字段的最佳方式
【发布时间】:2011-01-09 16:01:28
【问题描述】:

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

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

谢谢

【问题讨论】:

标签: python django


【解决方案1】:

也许这个问题对你有帮助: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

【解决方案2】:

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

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

在哪里

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    【解决方案4】:

    对于这种情况,我通常会做的是:

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

    【讨论】:

    • 我喜欢这个的是它超级干净而且没有依赖。大多数库或实用程序为您提供与此解决方案相同的功能最终结果,但存在损坏风险。
    【解决方案5】:

    也许在模型上粘贴一个方法,比如:

    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】:

      你不需要你的 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')
      

      【讨论】:

      • 好主意,但是错误。使用提问者定义的ORDER_STATUS 会将status_dict 设置为{0: 'Started', 1: 'Done', 2: 'Error'}。请注意,字典键是数字,而不是字符串。按照您的建议调用该方法会导致错误KeyError: 'Done'。将status_dict 更改为status_dict = {x[1]:x[0] for x in ORDER_STATUS},将self.status 更改为self.status = status_dict[val]
      【解决方案7】:

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

      【讨论】:

      • 我不明白如何将这些东西持久化到 Django 数据库中。这个答案可以扩展到那个主题吗?
      猜你喜欢
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 2012-09-22
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      相关资源
      最近更新 更多