2013-02-28 4 views
0

я следующий файл сказать prof.xmlмодели Django: динамически генерировать модели поле

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

Теперь я хочу, чтобы создать Джанго модель, где модель должна выглядеть как этот

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 создать соответствующие таблицы и т.д.

Может быть, вы могли бы изменить свой дизайн немного и есть модель с key и value полей.

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

И есть ManyToMany или ForeignKey отношения с вашей моделью, как:

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') 

Если кто достаточно безумен, чтобы попробовать это, пожалуйста, комментарий и дайте мне знать, как она идет.

Смежные вопросы