python - 使用 Django ModelField 选择作为字符串的枚举——反模式?

标签 python django enums

我有一个 Django 字段,基本上用作通知首选项的枚举。

现在我把它设置成这样:

class MyModel(models.Model):
    # ...
    EVERY_TIME = 'every'; WEEKLY = 'weekly'; NEVER = 'never'
    NOTIFICATION_CHOICES = ((EVERY_TIME, "Every time"), (WEEKLY, "Weekly"), (NEVER, "Never"))
    notification_preferences = models.CharField(choices=NOTIFICATION_CHOICES, default=EVERY_TIME, max_length=10)

我知道通常这种枚举应该设置为 models.IntegerField 而不是 CharField,但是由于前端使用 Angular 和数据都是通过 API 提供的,我觉得它可能会为前端提供更多有用的信息以接收 'weekly' 而不是 2,例如。

CharField 用作枚举是否被认为是不好的做法?如果是这样,我的用例是否足够小以至于没什么大不了的,或者我是否遗漏了一些我应该更改的东西?

最佳答案

您可能需要考虑 Django-model-utils Choices库,它可以让您更好地控制枚举的文本版本。

要回答您的问题,并非所有事物都适用于整数标识符。考虑各州,澳大利亚有 7 个,当已知时他们有一个固定的集合:

ACT - Australian Capital Territory
NSW - New South Wales
NT  - Northern Territory
QLD - Queensland
SA  - South Australia
TAS - Tasmania
VIC - Victoria
WA  - Western Australia

由于这些相对固定(国家的组成不太可能改变,因此没有理由为每个分配一个整数,当文本编码和全名一样有效时。

我不会说使用 CharField 作为选择是一种反模式,只是一种方法,只有当您确定数据库的缩写版本在以下情况下有意义时才应该应用存储为文本。

你也可以使用Enum来存储你的值

from enum import Enum

class Countries(Enum):
   ACT = "Australian Capital Territory"
   NSW = "New South Wales"
   ...

class MyModel(models.Model):
    country = models.CharField(choices=[(tag.name, tag.value) for tag in Countries])

关于python - 使用 Django ModelField 选择作为字符串的枚举——反模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24669195/

相关文章:

python - 多个热图子图 : Same Heatbar

c++ - C++ 中的默认枚举可见性

c# - 如何将 int 转换为 enum 而不是使用 switch

python - 使用 Ipywidgets 按索引绘制 DataFrame 的交互式绘图

python - 如何在Python中找到两个表之间的匹配名称并更新第一个表?

python - MySQL 选择产品的所有组件

django - 类型对象 'X'没有属性 'objects'

python - 文件未找到错误: [Errno 2] No such file or directory: 'test_user1_user_id'

django - 将错误插入InlineFormSet自定义验证器

c++ - 如何将范围放在枚举上?