2012-03-09 86 views
10

在处理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), 
) 

...或类似的东西。

什么用法?

+2

我现在这是11个月前,但你有没有发现这方面的任何具体的好的做法呢?想知道这里同样的事情。 – blaze 2013-02-18 03:29:34

回答

8

如果您指定选项属性(当您通过用户表单插入/更新数据时),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) 
+2

我想要约束在数据库中,并且“枚举”是具有自己表的完整模型。基本上,我想知道Pythonic/Djangoish创建“Python”枚举的方式。 – alex 2012-03-10 13:25:26

+0

已更新我的回答 – San4ez 2012-03-11 06:00:33

+2

我建议其他/未指定,太! – Ashe 2013-09-17 03:32:39