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

时间:2016-06-13 16:13:36

标签: django class model field choice

我有一个模型类,其中包含一些" status"字段,具有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 OrderStatus:
       STATUS_ACTIVE = 1
       STATUS_ENDED = 2

但是从模型类中引用Order.OrderStatus.STATUS_ACTIVE会引发错误。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可以将这些选项封装在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'])

答案 2 :(得分:0)

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

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

还是这个?

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