gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:45:26 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com