2016-07-28 3 views
1

django(v1.9)では、ベースクラス で定義されているフィールドを、異なる子孫クラスで異なるデフォルト値を使用するように設定する方法はありますか?Djangoでは、異なるデフォルトを使うようにModelクラスの子孫を設定できますか?

class Base(models.Model): 
    OBJ_TYPES = (
     ('type_a', 'Type A'), 
     ('type_b', 'Type B'), 
     ('type_c', 'Type C'), 
     ('type_d', 'Type D'), 
    ) 
    obj_type = models.CharField(choices=OBJ_TYPES, default='type_a') 

class GenericChild(Base): 
    # obj_type defaults to type_a 
    pass 

class TypeDChild(Base) 
    # Want obj_type to default to type_d 
    # This causes error (local field clashes...) 
    obj_type = models.CharField(choices=OBJ_TYPES, default='type_d') 
+0

デフォルトは呼び出し可能ですが、関連するモデルサブタイプをチェックして適切な値を返す関数を呼び出すことができます。 –

+0

@simonecittadiniデフォルトでは呼び出し可能ですが、あなたは 'self'へのアクセス権がないので、呼び出し可能な内部のサブタイプをチェックすることはできません。 – Alasdair

+0

それはできないようです。この質問を参照してくださいhttp://stackoverflow.com/questions/2344751/in-django-model-inheritance-does-it-allow-you-to-override-a-parent-models-a – JustLive

答えて

0

はい、それは上書きすることはできますが、おそらくあなたが期待する方法ではありません。

class Base(models.Model): 
    OBJ_TYPES = (
     ('type_a', 'Type A'), 
     ('type_b', 'Type B'), 
     ('type_c', 'Type C'), 
     ('type_d', 'Type D'), 
    ) 
    obj_type = models.CharField(choices=OBJ_TYPES, default='type_a') 

    # Make sure you do this, always always always set your base classes to abstract 
    class Meta: 
     abstract = True 

class GenericChild(Base): 
    # obj_type defaults to type_a 
    pass 

class TypeDChild(Base) 
    # Want obj_type to default to type_d 
    # This causes error (local field clashes...) 
    # obj_type = models.CharField(choices=OBJ_TYPES, default='type_d') 
    pass 
TypeDChild._meta.get_field('obj_type').default = 'type_d' 

ご覧のとおり、クラス定義の後にデフォルトを更新する必要があります。 Djangoの将来のバージョンでは、モデルイントロスペクションがいくつかのリリースごとに動作する方法を更新するので、これはDjangoの将来のバージョンでは機能しないかもしれません。

関連する問題