我正在使用动态模型(遵循[1]的准则)构建应用程序,以为现有数据库创建接口。
这是我创建模型之一的功能(实际上,它具有更多的字段和内容,但这应该足够了):
def create_model(name):
# Meta class
class Meta:
pass
# Set up a dictionary to simulate declarations within a class
attrs = {'__module__': 'mymodule',
'Meta': Meta,
'fields': {
'myID': models.CharField(max_length=2, db_column='myID', primary_key=True),
'__unicode__': lambda self: self.myID,
}
}
# Create the class, which automatically triggers ModelBase processing
model = type(name, (models.Model,), attrs)
admin.site.register(model, admin.ModelAdmin)
return model
但是,当我尝试访问此模型时,得到以下
OperationalError
:(1054, "Unknown column 'database_table.id' in 'field list'")
似乎Django没有考虑我对字段
prymary_key
的myID
定义,它正在创建默认的id
字段。我想念什么吗?它是与动态模型创建相关的“错误”吗?有人知道解决方法吗?谢谢
[1] https://code.djangoproject.com/wiki/DynamicModels
最佳答案
您的字段和方法不应位于'fields'
的attrs
词典之内,而应位于attrs
字典的顶级。
这个:
attrs = {'__module__': 'mymodule',
'Meta': Meta,
'fields': {
'myID': models.CharField(max_length=2, db_column='myID', primary_key=True),
'__unicode__': lambda self: self.myID,
}
}
在功能上等效于此:
class MyModel(models.Model):
class Meta:
pass
fields = {
'myID': models.CharField(max_length=2, db_column='myID', primary_key=True),
'__unicode__': lambda self: self.myID,
}
def __unicode__(self):
return self.myID
ModelBase
元类采用在类的顶层定义的任何字段(实际上是具有contribute_to_class
方法的任何对象),并使用该字段上的contribute_to_class
方法将其“添加”到实际的类中。在此过程中,字段将添加到fields
字典中,但是在运行实际的元类之前,您不应该定义字段字典。您的attrs
应该看起来像这样:attrs = {'__module__': 'mymodule',
'Meta': Meta,
'myID': models.CharField(max_length=2, db_column='myID', primary_key=True),
'__unicode__': lambda self: self.myID,
}