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)
... 或类似的东西.
行什么您使用?
如果指定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)