2011-06-10 11 views
9

Estoy probando MongoEngine, una biblioteca de DRM para Python para usar con MongoDB. Puedo definir un modelo como este ejemplo desde el sitio:Crear un modelo de YAML/JSON sobre la marcha

class User(Document): 
    email = StringField(required=True) 
    first_name = StringField(max_length=50) 
    last_name = StringField(max_length=50) 

Funciona como un encanto y MongoEngine es muy agradable. Bueno, quiero ir más allá y preguntarme si puedo definir mis modelos en algún lugar de un archivo en JSON o YAML, o lo que sea, para luego crear un modelo que lo use. Entonces esta declaración podría verse así en JSON:

{ 
    "model":"User", 
    "fields":{ 
     "email":{ 
      "type":"string", 
      "required":"true" 
     }, 
     "first_name":{ 
      "type":"string", 
      "max_length":"50" 
     }, 
     "last_name":{ 
      "type":"string", 
      "max_length":"50" 
     } 
    } 
} 

Luego analizaría este JSON y crearía un modelo utilizándolo. Puede ser que sea solo una operación de importación única que realizaría cada vez que modifique la definición del modelo, o puede ser que analice todo el JSON todo el tiempo. ¿Es ese un buen escenario? Solo quiero que las personas que usarán la aplicación definan sus propios modelos sin tener que profundizar en el código. Se aprecia cualquier idea sobre cómo crear modelos dinámicos

Respuesta

5

Si va a utilizar YAML, pyyaml es completamente sencillo y genera automáticamente una estructura de datos utilizando los tipos incorporados de Python (o incluso los tipos más complejos que defina) .

cualquier forma que se vaya, también recomendaría altamente Rx como un validador para que pueda verificar fácilmente la integridad de los archivos cargados. *

En cuanto a usar esto para crear un modelo que puede utilizar el built-in función type (no type(object), pero type(name, bases, dict)) que ... "[r] crear un nuevo tipo de objeto. Esta es esencialmente una forma dinámica de la declaración de clase."

Por lo tanto, puede llamar a:

def massage(fields_dict): 
    #transform your file format into a valid set of fields, and return it 

user_class = type(yaml_data['model'], Document, massage(yaml_data['fields'])) 

* He usado ambos juntos en las últimas ocho horas, por casualidad - que trabajan juntos sin dolor, por ejemplo .:

import yaml 
import Rx 

data = yaml.load(open("foo.yaml") 
rx = Rx.Factory({ "register_core_types": True }) 
schema = rx.make_schema(yaml.load(open("schema.yaml"))) 

if not schema.check(data): 
    raise ValueError("data file contents are not in a valid format") 
+0

gran información; gracias por esto – Profane

Cuestiones relacionadas