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

2024-05-15 02:18:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在最新的Django版本中为choice字段使用新的枚举类型。具体而言,我试图将美国各州存储如下:

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属性,通过执行以下操作使代码更加模块化:

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)

这给了我一个错误,如下所示:

if self.max_length is not None and choice_max_length > self.max_length:
TypeError: '>' not supported between instances of 'int' and 'States'

我知道Django还为integer提供了一个可选的IntegerChoices,但我如何同时使用文本和整数选项呢


Tags: djangomodelslengthmaxclasschoicesakal
1条回答
网友
1楼 · 发布于 2024-05-15 02:18:08

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的choice类

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

相关问题 更多 >

    热门问题