我正在尝试动态构建一些类,它们是 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
定义的类中。这是怎么回事?
最佳答案
可能是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
应用程序。
关于Python:使用 type() 时缺少类属性 __module__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7320705/