2012-03-09 387 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