2013-02-28 110 views
0

我有以下文件说prof.xmlDjango模型:动态生成模型场

<include> 
    <param name="xxx" value="yyy"/> 
    <param name="mmm" value="nnn"/> 
</include> 

现在我想创建Django的模型,其中模型应该是这样的

class prof: 
    xxx= models.CharField(verbose_name="XXX",max_length=45) 
    mmm = models.CharField(verbose_name="YYY",max_length=100) 

即模型字段的名称应该是xml文件中的参数名称,并且应将xml文件中的值插入到数据库中。如何才能做到这一点?

我已经做了这样的事情来从XML获取参数名称,但我不知道如何创建模型字段名称。

import os 
files = [file for file in os.listdir(os.path.join(path,'prof.xml')) if     os.path.isfile(file)] 
for file in files: 
    f = open((os.path.join(path,'prof.xml')),'r') 
    for line in f.readlines(): 
     pos1 = line.find("param name") 
     pos2 = line.find("value") 
     if pos1>=0 and pos2>=0: 
      field_name=line[pos1+12:pos2-2] 

回答

2

我不知道你能做到这一点动态,为创建模型后,需要执行syncdb创建适当的表等

可能是你可以改变你的设计了一下,有一个模型与keyvalue字段。

class DataContainer(models.Model): 
    key = models.CharField(verbose_name="key",max_length=45) 
    value = models.CharField(verbose_name="value",max_length=100) 

而且具有ManyToManyForeignKey与您的模型像关系:

class SomeModel(models.Model): 
    data = models.ManyToManyField(DataContainer) 
1

首先,你不应该用手解析你的XML。这是一场灾难。使用图书馆。

此外,我要第二次罗汉的建议,不试图动态地创建你的模型,但它是可能的。我在图书馆的测试中做到这一点,as seen here,但我从来没有尝试过制作永久表。我没有测试过这一点,但这样的事情可能工作:

from django.core.management import call_command 
from django.db import models 

def create_new_model(name, fields): 
    new_model = type(name, models.Model, fields) 
    models.register_models('myapp', new_model) 
    call_command('syncdb') 

如果任何人的疯狂足以试试这个,请评论,让我知道如何去。