Django模型:动态生成模型字段

时间:2013-02-28 06:47:57

标签: django django-models

我有以下文件说prof.xml

<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获取param名称,但我不知道如何创建模型字段名称。

 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 个答案:

答案 0 :(得分: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 :(得分:1)

首先,您不应该手动解析XML。这是灾难的秘诀。使用图书馆。

此外,我将讨论Rohan的建议,不要试图动态创建模型,但这是可能的。我在测试库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')

如果有人疯狂地尝试这个,请发表评论并让我知道它是怎么回事。