使用Django进行运行时模型生成
我有一个应用程序,需要在运行时生成它的模型。
这个生成是根据当前的数据库结构来进行的。
我该怎么做呢?
我怎么能在Python中动态创建类呢?
我是不是应该先创建一个JSON格式的表示,然后把它保存到数据库里,再把它转回Python对象?
3 个回答
我有一个应用程序,需要在运行时生成它的模型。
你可以看看这个 源代码,这是 inspectdb
管理命令的代码。Inspectdb
是用来“检查数据库中表的结构,并输出一个 Django 模型模块(一个 models.py 文件)到标准输出。”
我该如何在 Python 中动态创建类?
一种方法是使用 new
模块提供的函数(这个模块在 2.6 版本后被弃用了,推荐使用 types
模块)。
我应该创建一个 JSON 表示并把它保存在数据库中,然后再把它反序列化成 Python 对象吗?
我觉得这不是个好主意。
PS: 说了这么多,你真的应该重新考虑一下在运行时创建类的这个想法。对于一个 web 应用来说,这似乎有点极端。仅仅是我的个人看法。
你可以参考Django对旧数据库的支持,这样你就能从数据库中的定义获取Django模型。
具体可以查看这里:http://docs.djangoproject.com/en/dev/howto/legacy-databases/?from=olddocs
特别是,
manage.py inspectdb
这段代码可以让你在一个文件中创建类。然后你应该能够随时导入这些类。
不过,我觉得这样做可能有点风险。
你可以试着看看这个链接:http://code.djangoproject.com/wiki/DynamicModels
这里有一个创建 Python 模型类的例子:
Person = type('Person', (models.Model,), {
'first_name': models.CharField(max_length=255),
'last_name': models.CharField(max_length=255),
})
你还可以了解一下 Python 的元类:
- 什么是 Python 中的元类?
- http://www.ibm.com/developerworks/linux/library/l-pymeta.html
- http://gnosis.cx/publish/programming/metaclass_1.html