django 编写模型字段选择的更好方法?

django better way to write model field choices?

我有一个带有一些 "status" 字段的模型 class,它有一个 choices 选项(每个选项都有自己的业务逻辑)。
根据 Django 网站,应该这样设置选项:

class Order:
   STATUS_ACTIVE = 1
   STATUS_ENDED = 2
   STATUS_CANCELED = 3
   ORDER_STATUS_CHOICES = ( (STATUS_ACTIVE, 'Active'),
                             (STATUS_ENDED, 'Ended'),
                             (STATUS_CANCELED, 'Canceled'), )

   order_status = models.IntegerField(choices=ORDER_STATUS_CHOICES)
   order_status2 = models.IntegerField(choices=ORDER_STATUS2_CHOICES)

问题是,我的模型 class 有很多字段的很多选择,这感觉很糟糕,可以以某种方式封装它,但仍然保留这些选择 inside 模型 class ?

我试过使用像

这样的内部 class
class OrderStatus:
       STATUS_ACTIVE = 1
       STATUS_ENDED = 2

但是从模型内部引用 Order.OrderStatus.STATUS_ACTIVE class 会引发错误。

如果 django 文档告诉您这样做,那不是垃圾邮件,而是人们使用它们的方式。你可以用更少的代码做类似的事情:

STATUS_ACTIVE, STATUS_ENDED, STATUS_CANCELED = range(1, 4)

您可以将这些选择封装在 dict:

   status1 = {'STATUS_ACTIVE': 1,
   'STATUS_ENDED': 2,
   'STATUS_CANCELED': 3, 
   'ORDER_STATUS_CHOICES': ( (STATUS_ACTIVE, 'Active'),
                             (STATUS_ENDED, 'Ended'),
                             (STATUS_CANCELED, 'Canceled'), )}


   order_status = models.IntegerField(choices=status1['ORDER_STATUS_CHOICES'])
   order_status2 = models.IntegerField(choices=status2['ORDER_STATUS_CHOICES'])

如果改用它会有什么变化?

ORDER_STATUS_CHOICES = ( (1, 'Active'), (2, 'Ended'), (3, 'Canceled') )

或者这个?

ORDER_STATUS_CHOICES = ( ('1', '1-Active'), ('2', '2-Ended'), ('3', '3-Canceled') )