2011-09-06 20 views
8

Estoy intentando construir dinámicamente algunas clases que son subclases de los modelos de django.Modelo. Mi código es el siguiente:Python: atributo de clase faltada __module__ cuando se usa type()?

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

Cuando Django intenta cargar esto, se da la siguiente excepción:

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__' 

Parece que una clase construidos usando type() es no conseguir el miembro que es __module__ presente para la clase definida con class. ¿Que está pasando aqui?

Respuesta

13

¿Puede ser metaclasses es la mejor opción para sus necesidades que la de bajo nivel type()?

Pero en la mayoría de los casos se puede utilizar __name__ como un valor para __module__ como

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

Django utiliza __module__ valor para determinar qué aplicación Django posee este modelo, por lo que los modelos de my_app1/models.py contendrán my_app1.models y Django sabe que los modelos desde ese archivo | módulo pertenece a la aplicación my_app1.

Cuestiones relacionadas