在Django选择字段中同时使用整数和字符串



我正在尝试使用最新Django版本中的新Enum类型作为选项字段。具体来说,我试图将美国的各个州存储如下:

class States(models.TextChoices):
ALABAMA = 'AL', 'Alabama'
ALASKA = 'AK', 'Alaska'
.....
.....
WISCONSIN = 'WI', 'Wisconsin'
WYOMING = 'WY', 'Wyoming'

class PersonalInfo(models.Model):
state = models.CharField(max_length=2, choices=States.choices, default=States.ALABAMA)

工作符合预期。现在,我还试图将max_length变量也作为choice类的类属性,通过以下操作使代码更加模块化:

class States(models.TextChoices):
ALABAMA = 'AL', 'Alabama'
ALASKA = 'AK', 'Alaska'
.....
.....
WISCONSIN = 'WI', 'Wisconsin'
WYOMING = 'WY', 'Wyoming'
MAX_LENGTH = 2

class PersonalInfo(models.Model):
state = models.CharField(max_length=States.MAX_LENGTH, choices=States.choices, default=States.ALABAMA)

这给我一个错误如下:

如果self.max_length不是None并且choice_max_length>self.max_length:
类型错误:'>'在"int"one_answers"States"的实例之间不支持

我知道Django也为integer提供了一个替代IntegerChoices,但我如何同时使用文本和整数选项。

TextChoices必须包含字符串值,这些值的工作方式是枚举您在类中定义的内容。因此,您得到了一个不起作用的混合类型,因为它将尝试将2作为选项之一,因为它是选项类的一部分。

你可以做的是将选择定义为一个常数,有点像这样;

STATE_MAX_LENGTH = 2

class States(models.TextChoices):
ALABAMA = 'AL', 'Alabama'
ALASKA = 'AK', 'Alaska'
.....
.....
WISCONSIN = 'WI', 'Wisconsin'
WYOMING = 'WY', 'Wyoming'

class PersonalInfo(models.Model):
state = models.CharField(max_length=STATE_MAX_LENGTH, choices=States.choices, default=States.ALABAMA)

为了确认,以下是django的选择类;

class Choices(enum.Enum, metaclass=ChoicesMeta):
"""Class for creating enumerated choices."""
def __str__(self):
"""
Use value when cast to str, so that Choices set as model instance
attributes are rendered as expected in templates and similar contexts.
"""
return str(self.value)

class IntegerChoices(int, Choices):
"""Class for creating enumerated integer choices."""
pass

class TextChoices(str, Choices):
"""Class for creating enumerated string choices."""
def _generate_next_value_(name, start, count, last_values):
return name

最新更新