2010-07-08 17 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,并包含许多其他自定义属性。