2011-06-10 13 views
9

पर वाईएएमएल/जेएसओएन से एक मॉडल बनाएं मैं मोंगोडीबी के साथ उपयोग करने के लिए पाइथन के लिए एक डीआरएम लाइब्रेरी MongoEngine का प्रयास कर रहा हूं। मैं साइट से इस उदाहरण की तरह एक मॉडल को परिभाषित कर सकते हैं:फ्लाई

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

यह एक आकर्षण की तरह काम करता है और MongoEngine वास्तव में अच्छा है। खैर, मैं आगे बढ़ना चाहता हूं और आश्चर्यचकित हूं कि क्या मैं JSON या YAML में किसी फ़ाइल में कहीं भी अपने मॉडल को परिभाषित कर सकता हूं, या फिर जो कुछ भी इसका उपयोग कर मॉडल बना सकता है। तो यह घोषणा JSON में ऐसा दिखाई दे सकता:

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

तब मैं इस JSON पार्स करने और इसे का उपयोग एक मॉडल बनाने जाएगा। हो सकता है कि यह केवल एक ही आयात ऑपरेशन हो सकता है कि जब भी मैं मॉडल परिभाषा को संशोधित करता हूं, तो मैं हर बार प्रदर्शन करता हूं, या हो सकता है कि यह हर बार पूरे JSON को पार्स कर सके। क्या यह एक अच्छा परिदृश्य है? मैं सिर्फ उन लोगों को देना चाहता हूं जो ऐप का उपयोग कोड में खोदने के बिना अपने मॉडल को परिभाषित करेंगे। गतिशील मॉडल निर्माण करने के बारे में कोई भी विचार

उत्तर

5

यदि आप वाईएएमएल का उपयोग करने जा रहे हैं, pyyaml पूरी तरह से दर्द रहित है, और स्वचालित रूप से पाइथन के अंतर्निर्मित प्रकारों (या आपके द्वारा परिभाषित किए जाने वाले अधिक जटिल प्रकारों) का उपयोग करके डेटा संरचना को आउटपुट करता है। ।

किसी भी तरह से आप जाओ, मैं भी अत्यधिक Rx एक सत्यापनकर्ता के रूप में की सिफारिश करेंगे ताकि आप आसानी से भरी हुई फाइलों की अखंडता को सत्यापित कर सकते हैं। *

के रूप में इस का उपयोग करते हुए एक मॉडल बनाने के लिए आप उपयोग कर सकते हैं में निर्मित फ़ंक्शन type (type(object) नहीं, लेकिन type(name, bases, dict)) जो ... "[आर] एक नई प्रकार की वस्तु को eturn। यह अनिवार्य रूप से कक्षा विवरण का एक गतिशील रूप है।"

तो, आप कॉल कर सकते हैं:

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

* मैं इन दोनों का उपयोग किया है एक साथ पिछले आठ घंटे में, संयोग से - वे एक साथ दर्द काम, उदा .:

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

महान जानकारी; इसके लिए धन्यवाद – Profane

संबंधित मुद्दे