转自: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]