2011-09-06 17 views
8

我試圖動態地構建一些django的models.Model的子類的類。我的代碼如下所示:Python:使用type()時缺少類屬性__module__?

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

當Django嘗試加載此,它提供了以下異常:

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()

但在大多數情況下,你可以使用__name__

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

的Django的__module__值使用__module__值確定哪個Django應用程序擁有這個模式,所以在my_app1/models.py車型將包含my_app1.models和Django知道有些車型來自該文件的模塊屬於my_app1申請。