2012-03-09 12 views
10

Djangoで "サポートテーブル"を扱うベストプラクティスはありますか?Django - "enum models"

私は実際に完全性を強制するわけではありません(チェック制約を作成することさえありません)ので、本格的なモデルを作成することをお勧めします(しばしば、サポートテーブル)。

完全なモデルを使用すると、テーブルコンテンツの初期データフィクスチャを作成するのが適切だと思いますが、行の名前付きインスタンスを持つ「正しい方法」があります。 ..

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

答えて

8

Django ORMはchoices属性(ユーザーフォームを使用してデータを挿入/更新する場合)を指定するかどうかをチェックします。

また、検証ロジックをデータベースレベルに設定し、データベースがこれをサポートする場合はデータベース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) 
+2

私は制約をデータベースに入れ、 "enums"は独自のテーブルを持つ完全なモデルにします。基本的には、Python/Djangoishの "Python"列挙型を作成する方法について疑問に思っています。 – alex

+0

私の回答を更新しました – San4ez

+2

私はその他/未指定もお勧めします! – Ashe