使用Django进行运行时模型生成

5 投票
3 回答
3125 浏览
提问于 2025-04-16 04:57

我有一个应用程序,需要在运行时生成它的模型。
这个生成是根据当前的数据库结构来进行的。
我该怎么做呢?
我怎么能在Python中动态创建类呢?
我是不是应该先创建一个JSON格式的表示,然后把它保存到数据库里,再把它转回Python对象?

3 个回答

1

我有一个应用程序,需要在运行时生成它的模型。

你可以看看这个 源代码,这是 inspectdb 管理命令的代码。Inspectdb 是用来“检查数据库中表的结构,并输出一个 Django 模型模块(一个 models.py 文件)到标准输出。”

我该如何在 Python 中动态创建类?

一种方法是使用 new 模块提供的函数(这个模块在 2.6 版本后被弃用了,推荐使用 types 模块)。

我应该创建一个 JSON 表示并把它保存在数据库中,然后再把它反序列化成 Python 对象吗?

我觉得这不是个好主意。

PS: 说了这么多,你真的应该重新考虑一下在运行时创建类的这个想法。对于一个 web 应用来说,这似乎有点极端。仅仅是我的个人看法。

2

你可以参考Django对旧数据库的支持,这样你就能从数据库中的定义获取Django模型。

具体可以查看这里:http://docs.djangoproject.com/en/dev/howto/legacy-databases/?from=olddocs

特别是,

manage.py inspectdb 

这段代码可以让你在一个文件中创建类。然后你应该能够随时导入这些类。

不过,我觉得这样做可能有点风险。

8

你可以试着看看这个链接: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

撰写回答