转自:http://blog.csdn.net/wenxuansoft/article/details/8039011
当定义好Django Model后,一般可以在初始化调用Syncdb方法来自动在数据库里面生成相应的表。
那么如果想在后续阶段想根据根据Django Model动态生成数据表,该怎么办呢?
要生成数据库表,就得先根据model的定义先生成SQL语句,然后在数据库里面执行。
并且由于要支持不同的数据库,所生成的SQL语句可能还有差别,如果自己去读model来生成SQL语句无疑笨办法。
好在Django提供了sql,sql_all命令来打印MODEL的 SQL语句,因此通过对分析源码,找到了办法:
比如Model定义如下:
class TestModel(models.Model):
Name=models.CharField(max_length=64,blank=True)
>>> from django.core.management.color import no_style
#Style是用来输出语句时着色的,没什么用
>>> from django.db import connection
>>> from django.db.backends import creation
#这里面有个类BaseDatabaseCreation,就是用来生成SQL语句的。
>>> T=TestModel()
>>> c=creation.BaseDatabaseCreation(connection)
>>>c.sql_create_model(T,no_style())[0]
['CREATE TABLE "abc" (\n "id" integer NOT NULL PRIMARY KEY,\n "Theme" varchar(64) NOT NULL\n)\n;']
这样就可以取得这个模型的SQL定义语句了,并且针对不同的数据库处理Django已经帮我们做好了。
有了SQL定义语句,我们就可以调用直接生成表了。
#coding:utf8 from django.core.management.base import BaseCommand from apps.hospital.models import Province, City, Area class Command(BaseCommand): def handle(self, *args, **options): from django.core.management.color import no_style #Style是用来输出语句时着色的,没什么用 from django.db import connection from django.db.backends import creation #这里面有个类BaseDatabaseCreation,就是用来生成SQL语句的。 c = creation.BaseDatabaseCreation(connection) for model in [Province, City, Area]: T = model() print c.sql_create_model(T,no_style())[0][0]