【问题标题】:Python: missing class attribute __module__ when using type()?Python:使用 type() 时缺少类属性 __module__?
【发布时间】:2011-11-11 08:26:43
【问题描述】:

我正在尝试动态构建一些类,它们是 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() 构造的类没有获得__module__ 成员,该成员存在于使用class 定义的类中。这是怎么回事?

【问题讨论】:

    标签: python django


    【解决方案1】:

    可能metaclasses 比低级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 应用程序。

    【讨论】:

      猜你喜欢
      • 2019-09-27
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2022-01-19
      • 2019-04-04
      • 2018-03-08
      • 2021-12-20
      • 2014-05-24
      相关资源
      最近更新 更多