【问题标题】:django better way to write model field choices?django 编写模型字段选择的更好方法?
【发布时间】:2016-10-14 03:43:12
【问题描述】:

我有一个带有一些“状态”字段的模型类,其中有一个 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)

问题是,向我的模型类发送许多字段的选择感觉很糟糕,可以以某种方式封装它,但仍将这些选择保留在模型类内部? p>

我尝试过使用像

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

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

【问题讨论】:

  • 为什么要将它保留在模型中?
  • 因为这些选择与模型字段有关?同样根据 django 网站,最好将选项放在类中。虽然如果我看到它们变大,我可能会将它们分开

标签: django class model field choice


【解决方案1】:

如果你改用这个会有什么变化?

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

还是这个?

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

【讨论】:

  • 在做逻辑时,我必须比较'1',而不是一些枚举类型。今天我可以做 instance.status == Order.ACTIVE,更清晰的代码
【解决方案2】:

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

【讨论】:

  • 这很好,给我一个想法
  • 这正是我在这里所做的。
【解决方案3】:

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

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

【讨论】:

  • 当你有很多状态字段时它会变大,并且你不能再次使用相同的名称,所以选择出现在两个模型字段选择中的像ACTIVE这样的枚举名称,你不能再次使用它。所以我尝试以某种方式封装它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 2015-06-30
  • 1970-01-01
  • 2016-03-10
  • 2014-08-17
  • 2019-09-29
  • 1970-01-01
相关资源
最近更新 更多