2011-09-06 2 views
8

私はdjangoのmodels.Modelのサブクラスであるいくつかのクラスを動的に構築しようとしています。Python:type()を使用しているときにクラス属性__module__がありませんか?

は、Djangoはこれをロードしようと
MyModel = type('MyModel', (models.Model,), { 
    'field': models.BooleanField() 
    }) 

、それは次の例外を与える:私のコードは次のようになります

Traceback (most recent call last): 
    File "/usr/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 88, in inner_run 
    self.validate(display_num_errors=True) 
    File "/usr/lib/python2.7/site-packages/django/core/management/base.py", line 249, in validate 
    num_errors = get_validation_errors(s, app) 
    File "/usr/lib/python2.7/site-packages/django/core/management/validation.py", line 36, in get_validation_errors 
    for (app_name, error) in get_app_errors().items(): 
    File "/usr/lib/python2.7/site-packages/django/db/models/loading.py", line 146, in get_app_errors 
    self._populate() 
    File "/usr/lib/python2.7/site-packages/django/db/models/loading.py", line 61, in _populate 
    self.load_app(app_name, True) 
    File "/usr/lib/python2.7/site-packages/django/db/models/loading.py", line 78, in load_app 
    models = import_module('.models', app_name) 
    File "/usr/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module 
    __import__(name) 
    File "/home/user/project/app/models.py", line 221, in <module> 
    'field': models.BooleanField() 
    File "/usr/lib/python2.7/site-packages/django/db/models/base.py", line 38, in __new__ 
    module = attrs.pop('__module__') 
KeyError: '__module__' 

それはtype()がある__module__メンバーを取得されていない使用して構築されたクラスのように思えますclassで定義されたクラスに存在します。何が起きてる?

答えて

13

metaclassesは、低レベルよりも必要な場合に最適ですtype()

しかし、ほとんどの場合、あなたは

MyModel = type('MyModel', (models.Model,), { 
    'field': models.BooleanField(), 
    '__module__': __name__, 
}) 

my_app1/models.pyでモデルがmy_app1.modelsが含まれていますし、Djangoはそのモデルを知っているので、Djangoは、アプリがこのモデルを所有しているDjangoのかを決定するための__module__値を使用していますよう__module__の値として__name__を使用することができますそのファイルから|モジュールはmy_app1アプリケーションに属します。

関連する問題