Django - 处理“枚举模型”
问题描述:
在处理Django中的“支持表”有什么最佳做法吗?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),
)
...或类似的东西。
什么你用法?
答
如果您指定选项属性(当您通过用户表单插入/更新数据时),Django ORM会检查完整性。
您也可以将验证逻辑设置为数据库级别并使用数据库ENUM字段(如果您支持db的话)。
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)
我现在这是11个月前,但你有没有发现这方面的任何具体的好的做法呢?想知道这里同样的事情。 – blaze 2013-02-18 03:29:34