2010-07-08 20 views

回答

2

我認爲有2個選項。

  1. 使用expando。

    class SomeModel(db.Expando): 
        pass 
    
    your_model = SomeModel() 
    for k, v in your_dict.iteritems(): 
        setattr(your_model, k, v) 
    

    可能可以使用your_model.__dict__.update(your_dict),但我不知道這一點:當你忽略保留字段可以,只要存儲的東西。

  2. 儲存於使用泡菜一個文本框:

    class SomeModel(db.Model): 
        pickled_data = db.BlobProperty() 
    
    your_model = SomeModel() 
    your_model.pickled_data = pickle.dumps(your_dict) 
    
+0

tnx for link! http://github.com/Arachnid/aetycoon/blob/master/__init__.py – fdb 2010-07-08 14:35:19

+0

如果您使用自定義屬性,則不需要在每次要讀取該值時明確地取消該值。沒問題。鏈接:) – hawkett 2010-07-08 14:52:13

+0

確實,你的選擇更加優雅:) +1 – Wolph 2010-07-08 15:36:35

5

你只需要,如果你打算在個體詞典查詢元素使用的expando選項。

假設你不想這樣做,那麼你可以使用一個自定義屬性 -

class ObjectProperty(db.Property): 
    data_type = db.Blob 

    def get_value_for_datastore(self, model_instance): 
    value = self.__get__(model_instance, model_instance.__class__) 
    pickled_val = pickle.dumps(value) 
    if value is not None: return db.Blob(pickled_val) 

    def make_value_from_datastore(self, value): 
    if value is not None: return pickle.loads(str(value)) 

    def default_value(self): 
    return copy.copy(self.default) 

注意上面的屬性DEF我從一些代碼,尼克·約翰遜產生了。這是一個project on git hub,幷包含許多其他自定義屬性。