2011-09-06 20 views
8

Dinamik olarak django modellerinin alt sınıfları olan bazı sınıfları oluşturmaya çalışıyorum.Model.Python: type() kullanırken eksik class özniteliği __module__?

Django bu yüklenmeye çalışıyor
MyModel = type('MyModel', (models.Model,), { 
    'field': models.BooleanField() 
    }) 

, aşağıdaki istisna verir: Benim kod şöyle görünür

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

O type() olduğunu __module__ üyesi almıyor kullanılarak yapılmış bir sınıf gibi görünüyor class ile tanımlanan sınıf için mevcut. Burada neler oluyor?

cevap

13

metaclassestype()'dan daha düşük seviye gereksinimleriniz için en iyi seçimdir?

Ama

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

Django gibi __module__ için bir değer olarak __name__ kullanabilirsiniz çoğu durumda

my_app1/models.py modelleri my_app1.models içerecektir ve django modelleri bilmesi için, uygulama bu modeli sahibi django belirlemek için __module__ değeri kullanır bu dosyadan | modül my_app1 uygulamasına aittir.

İlgili konular