我正在使用动态模型构建应用程序(遵循[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
字段。
我错过了什么吗?这是与动态模型创建相关的“错误”吗?有人知道解决方法吗?感谢
答案 0 :(得分:3)
您的字段和方法不应位于'fields'
的{{1}}词典中,而应位于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
答案 1 :(得分:2)
我正在使用动态模型构建应用程序(遵循[1]的指导原则)为现有数据库创建接口。
你确定这是正确的做法吗?您不想使用manage.py inspectdb
来创建该数据库中的模型吗?参见:
https://docs.djangoproject.com/en/dev/howto/legacy-databases/