2011-09-06 33 views
8

Tôi đang cố gắng tự động xây dựng một số lớp học là lớp con của mô hình django.Model. Mã của tôi trông như thế này:Python: thiếu thuộc tính lớp __module__ khi sử dụng type()?

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

Khi Django cố gắng tải này, nó mang lại cho các ngoại lệ sau đây:

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

Nó có vẻ như một lớp học xây dựng bằng type() không nhận được các thành viên __module__ đó là hiện diện cho lớp học được xác định với class. Những gì đang xảy ra ở đây?

Trả lời

13

Có thể là metaclasses là lựa chọn tốt nhất cho nhu cầu của bạn so với mức thấp type()?

Nhưng trong hầu hết trường hợp, bạn có thể sử dụng __name__ như một giá trị cho __module__ như

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

Django sử dụng __module__ giá trị so với xác định django ứng dụng sở hữu mô hình này, vì vậy mô hình trong my_app1/models.py sẽ chứa my_app1.models và django biết rằng mô hình từ tệp đó | mô-đun thuộc về ứng dụng my_app1.

Các vấn đề liên quan