Python: отсутствует атрибут класса __module__ при использовании type ()? - PullRequest
8 голосов
/ 06 сентября 2011

Я пытаюсь динамически создать некоторые классы, которые являются подклассами моделей django. Модель.Мой код выглядит так:

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.Что здесь происходит?

1 Ответ

13 голосов
/ 06 сентября 2011

Может быть метаклассы - лучший выбор для вас, чем низкоуровневый type()?

Но в большинстве случаев вы можете использовать __name__ в качестве значения для __module__, как

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

Django использует значение __module__ для определения того, какому приложению django принадлежит эта модель, поэтому модели в my_app1/models.py будут содержать my_app1.models, и django знает, что модели из этого файла | модуля принадлежат приложению my_app1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...