2009-07-06 14 views
29

私のモデルを値の大きなディクテーション(.values()のようなものですが、関係をトラバースする)に簡単に変換できるようにするミックスインを書いています。これらの定義を行うにはクリーンな場所はモデル自身、ラ内にあるように見えます:DjangoモデルのMetaクラスに属性を追加する

TypeError: 'class Meta' got invalid attribute(s): schema 

(全体のスタックトレース:

class Person(models.Model, DeepValues): 
    name = models.CharField(blank=True, max_length=100) 
    tribe = models.ForeignKey('Tribes') 

    class Meta: 
     schema = { 
      'name' : str, 
      'tribe' : { 
       'name' : str 
      } 
     } 

Person.objects.all().deep_values() => { 
    'name' : 'Andrey Fedorov', 
    'tribe' : { 
     'name' : 'Mohicans' 
    } 
} 

しかし、Djangoはと私はclass Metaでこれを含めて文句here

ここで、私はmixinでこれを巧妙にオーバーライドすることができますが、この情報を格納するよりエレガントな方法がありますか?

答えて

45

私がエレガントについては知らないが、1実用的な方法は次のとおりです。

import django.db.models.options as options 

options.DEFAULT_NAMES = options.DEFAULT_NAMES + ('schema',) 

もちろん、Djangoはこれまで、独自の「スキーマ」属性を追加した場合、これは壊れます。しかし、ねえ、それは考えです...いつでも衝突する可能性の低い属性名を選ぶことができます。

+5

これは機能しませんが、これはありませんでした:options.DEFAULT_NAMES = options.DEFAULT_NAMES +( 'default_values'、) –

+2

ああ...おそらく私のソリューションはDEFAULT_NAMESをリストに変換していますが、それをタプルとして保持します。 –

+0

おそらく! :) –

関連する問題