2011-06-10 18 views
9

MongoDB ile kullanmak için bir Python DRM kütüphanesi olan MongoEngine çalışıyorum. Ben sitesinden bu örnekteki gibi bir model tanımlayabilirsiniz:YAML/JSON modelinden bir model oluşturun

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

Bu bir cazibe gibi çalışır ve MongoEngine gerçekten güzel. Eh, ben daha fazla gitmek istiyorum ve modellerimi JSON veya YAML bir dosyada bir yerde tanımlayabilir miyim, ya da her ne olursa olsun o kullanarak bir model oluşturmak için merak ediyorum. Yani bu beyan JSON bu gibi görünebilir:

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

Sonra bu JSON ayrıştırmak ve bunu kullanarak bir model oluşturacak. Model tanımını her değiştirdiğimde gerçekleştireceğim tek bir içe aktarma işlemi olabilir veya her zaman JSON'u ayrıştırabilir. Bu iyi bir senaryo mu? Sadece uygulamayı kullanacak kişilerin kodları girmeden kendi modellerini tanımlamasına izin vermek istiyorum. Dinamik model oluşturma hakkında herhangi bir fikir takdir edilir

cevap

5

YAML kullanacaksanız, pyyaml tamamen ağrısızdır ve otomatik olarak python'un yerleşik türlerini (veya tanımladığınız daha karmaşık türlerini) kullanarak bir veri yapısı oluşturur. . Kolayca yüklenen dosyaların bütünlüğünü doğrulamak böylece

gitmek herhangi bir şekilde, ben de son derece bir doğrulayıcı olarak Rx öneriyoruz. *

gibi bir model oluşturmak için bu kullanmak için kullanabileceğiniz yerleşik type (type(object) değil, type(name, bases, dict) değil) işlevini yerine getirin. "[r] yeni bir nesne yazmayı. Bu, temel olarak sınıf ifadesinin dinamik bir formudur."

Yani

, Arayabileceğin: Birlikte son sekiz saat içinde bu ikisini kullandım *

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

tesadüfen - onlar

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

Büyük haberdar .: ör acısız birlikte çalışmak; Bunun için teşekkürler – Profane