Django - 处理"枚举模型"

ale*_*lex 12 python django django-models

在Django中处理"支持表"是否有最佳实践?

我不喜欢Field.choices,因为它没有真正强制完整性(它甚至没有创建检查约束),所以我更喜欢创建一个完整的模型(通常,我发现自己在支持表中添加了额外的字段).

现在,如果我使用完整模型,我认为正确的方法是为表内容创建一个初始数据夹具,但是有一个"正确的方法"来命名行的实例,比如...

class State(models.Model):
    name = model.TextField()

STATES = dict(
    NEW=State.objects.get(pk=0),
    IN_PROGRESS=State.objects.get(pk=1),
)
Run Code Online (Sandbox Code Playgroud)

... 或类似的东西.

行什么使用?

San*_*4ez 8

如果指定choices属性(当您通过用户表单插入/更新数据时),Django ORM会检查完整性.

如果db支持,您还可以将验证逻辑设置为数据库级别并使用数据库ENUM字段.

UPD:

class EnumField(models.Field):

    def __init__(self, *args, **kwargs):
        super(EnumField, self).__init__(*args, **kwargs)
        if not self.choices:
            raise AttributeError('EnumField requires `choices` attribute.')

    def db_type(self):
        return "enum(%s)" % ','.join("'%s'" % k for (k, _) in self.choices)

GENDER_MALE = 'm'
GENDER_FEMALE = 'f'
GENDER_CHOICES = (
    (GENDER_MALE, 'Male'),
    (GENDER_FEMALE, 'Female'),
)


class Person(models.Model):
    name = models.CharField(max_length=50)
    gender = EnumField(choices=GENDER_CHOICES)
Run Code Online (Sandbox Code Playgroud)

  • 我希望约束在数据库中,并且"enums"是具有自己的表的完整模型.基本上,我想知道Pythonic/Djangoish创建"Python"枚举的方法. (2认同)
  • 我建议其他/未指定! (2认同)