Python: 使用type()时缺少类属性__module__?

10 投票
1 回答
3297 浏览
提问于 2025-04-17 01:34

我正在尝试动态创建一些类,这些类是Django的模型(models.Model)的子类。我的代码是这样的:

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() 创建的类没有像用 class 定义的类那样拥有 __module__ 这个属性。到底发生了什么呢?

1 个回答

16

也许元类更适合你的需求,而不是低级的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这个应用。

撰写回答