我需要为现有的以前未知的表创建模型。其他人曾说过
您可以查看inspectdb代码,而不是输出代码返回类。
但对于 python 新手来说,我遇到了困难。谁能提供一个更具体的例子来说明如何做到这一点?非常感谢。
更新:我正在探索这个。看起来很有希望。似乎有几种创建动态模型的选项,其中一些虽然需要非 mySQL 数据库(请参阅此stackoverflow Q)
UPDATE2:我现在可以使用以下函数在运行时创建以前未知的 mysql 表的模型。但是,当我尝试查询模型时,对于名为 'table1' 的表,我得到“表 'djangodb.subscription_table1' 不存在”)。当我将 'table1' 重命名为 'subscription_table1' 时,出现此错误:“表 'djangodb.subscription_subscription_tb2f1e1e47d73417ab2b187bc4a08bf57' 不存在”)。
帮助!
最后更新:我针对我的特定问题采用了另一种解决方案:Django - List of Dictionaries to Tables2
def getModel(table_name):
myColumns=getColumns(table_name)
attrs = {}
attrs['__module__'] = 'subscription.models'
for x,y in myColumns.items():
fieldType = y["type"]
if x == 'id': ''
elif fieldType == "char": attrs[x]=models.CharField(max_length='length')
elif fieldType == "float": attrs[x]=models.FloatField(max_length='length')
elif fieldType == "int": attrs[x]=models.IntegerField()
elif fieldType == "text": attrs[x]=models.TextField()
else: print "AW PROB in exptDB---------------",x,y["type"],y["length"]
myModel = type(str(table_name), (models.Model,), attrs)
return myModel
def getColumns(expt_id):
cursor = connection.cursor()
cursor.execute("desc %s;" % (expt_id))
exptInfo = str(cursor.fetchall())[1:-1]
myList= exptInfo.split("""(u'""")
myColumns = {}
for item in myList:
mySplit = item.replace("u'","").replace("'","").replace(" ","").split(",")
if len(mySplit)>=2:
subSplit=mySplit[1].split("(")
if len(subSplit)>=1:
subSplit.append('999')#does not latter.
myColumns[mySplit[0]]={"type":subSplit[0],"length":subSplit[1].replace(")","")}
return myColumns