2011-06-10 87 views
9

我正在嘗試MongoEngine,這是一個供MongoDB使用的Python的DRM庫。我可以從網站定義像這個例子中的典範:在YAML/JSON上快速創建模型

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

如果你打算使用YAML,pyyaml是完全無痛的,並自動輸出一個數據結構使用python的內置類型(或更復雜的類型,你定義) 。

你去任何辦法,我也強烈建議Rx作爲驗證,因此您可以輕鬆地驗證加載的文件的完整性。*

至於使用它來創建一個模型,你可以使用內置的函數type(不是type(object),但是type(name, bases, dict))......「[r]創建一個新類型對象,這實質上是類聲明的一種動態形式。」

所以,你可以撥打:

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

*我一起在過去8使用小時這兩個,巧合的是 - 他們一起工作怕疼,例如:

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 2011-08-18 01:34:33