jdo*_*dot 5 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)
Run Code Online (Sandbox Code Playgroud)
我知道一般这种枚举应该设置为 amodels.IntegerField而不是 a CharField,但是由于前端使用 Angular 并且数据都是通过 API 提供的,我觉得它可能会为前端提供一些更有用的信息-end 接收'weekly'而不是2,例如。
将 aCharField用作枚举是否被认为是不好的做法?如果是这样,我的用例是否足够小以至于没什么大不了的,还是我遗漏了什么我应该改变它?
小智 4
您可能需要考虑Django-model-utilsChoices库,它可以让您更好地控制枚举的文本版本。
为了回答你的问题,并不是所有东西都适合整数标识符。考虑一下各州,澳大利亚有 7 个州,并且它们有一个已知的固定集:
ACT - Australian Capital Territory
NSW - New South Wales
NT - Northern Territory
QLD - Queensland
SA - South Australia
TAS - Tasmania
VIC - Victoria
WA - Western Australia
Run Code Online (Sandbox Code Playgroud)
由于这些是相对固定的(国家的组成不太可能改变,因此没有理由为每个国家分配一个整数,因为全名的文本编码也同样有效。
我不会说使用 aCharField作为选择是一种反模式,只是一种仅在您确定数据库的缩写版本在存储为文本时有意义时才应应用的方法。
您也可以用来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])
Run Code Online (Sandbox Code Playgroud)