2013-02-28 3 views
0

Je le fichier suivant dire prof.xmlmodèles Django: générer dynamiquement champ modèle

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

Maintenant, je veux créer le modèle de django où le modèle devrait ressembler à ceci

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

-à-dire le modèle les champs doivent avoir les noms qui sont des noms de paramètres dans le fichier xml et les valeurs dans le fichier xml doivent être insérées dans la base de données. Comment cela peut-il être fait?

J'ai fait quelque chose comme ceci pour obtenir le nom de paramètre du xml mais je ne sais pas comment créer des noms de champ de modèle hors de cela.

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] 

Répondre

2

Je ne suis pas sûr que vous pouvez le faire de façon dynamique, après avoir créé le modèle, vous devez syncdb pour créer des tableaux appropriés etc.

Peut-être vous pouvez changer votre conception un peu et avoir un modèle avec key et value champs.

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

Et ont ManyToMany ou ForeignKey relation avec votre modèle comme:

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

Tout d'abord, vous ne devriez pas être votre analyse syntaxique XML à la main. C'est une recette pour le désastre. Utilisez une bibliothèque.

Aussi, je vais appuyer le conseil de Rohan de ne pas essayer de créer dynamiquement vos modèles, mais c'est possible. Je le fais dans les tests pour les bibliothèques, as seen here, mais je ne l'ai jamais essayé pour faire des tables permanentes. Je ne l'ai pas testé, mais quelque chose comme ça pourrait fonctionner:

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

Si quelqu'un est assez fou pour essayer, s'il vous plaît commentaire et laissez-moi savoir comment ça se passe.

Questions connexes