2011-09-06 3 views
8

django의 models.Model 하위 클래스 인 일부 클래스를 동적으로 생성하려고합니다.Python : type()을 사용할 때 클래스 속성 __module__이 누락 되었습니까?

장고이로드하려고
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__, 
}) 

장고와 같은 __module__의 값으로 __name__을 사용할 수 있습니다 대부분의 경우

my_app1/models.py에서 모델 my_app1.models를 포함하고 장고 모델 있음을 알 수 있도록, 응용 프로그램은이 모델을 소유 장고 결정에 대한 __module__ 값을 사용합니다 해당 파일의 모듈은 my_app1 응용 프로그램에 속합니다.

관련 문제