2010-11-19 139 views
1

是否有一种使用ListProperty来存储子类型db.Property类型的优雅方式?ListProperty的自定义属性

例如,来自this exampleFuzzyDateProperty使用get_value_for_datastore()make_value_from_datastore()其属性转换成被存储在数据存储区中一个int。由于那一个int是一个Python原语,所以您应该能够创建一个ListPropertyFuzzyDateProperty。怎么样?

在我的特殊情况下,我定义了一个类和辅助函数来整齐地序列化/反序列化它的属性。我想将类封装为db.Property,而不是让实现者处理类和Model属性之间的关系。

回答

1

按照@mjhm和@Nick的建议,我已经将ListProperty分类为接受任何类。我有uploaded a generic version to GitHub,名为ObjectListProperty。我使用它作为使用并行ListProperty的替代方案。

ObjectListProperty在获取&放置模型时透明地序列化/反序列化。它有一个内部序列化方法,可用于简单对象,但如果它们定义了自己的序列化方法,则可以处理更复杂的对象。这里有一个简单的例子:

 
from object_list_property import ObjectListProperty 

class Animal(): 
    """ A simple object that we want to store with our model """ 
    def __init__(self, species, sex): 
     self.species = species 
     self.sex = sex if sex == 'male' or sex == 'female' else 'unknown' 

class Zoo(db.Model): 
    """ Our model contains of list of Animal's """ 
    mammals = ObjectListProperty(Animal, indexed=False) 

class AddMammalToZoo(webapp.RequestHandler): 
    def post(self): 
     # Implicit in get is deserializing the ObjectListProperty items 
     zoo = Zoo.all().get() 

     animal = Animal(species=self.request.get('species'), 
         sex=self.request.get('sex')) 

     # We can use our ObjectListProperty just like a list of object's 
     zoo.mammals.append(animal) 

     # Implicit in put is serializing the ObjectListProperty items 
     zoo.put() 
+1

链接被破坏,我找不到任何它曾经存在的证据:( – Thomas 2012-01-11 14:14:35

+0

@Thomas修正了!谢谢你的抬头 – 2012-02-20 00:50:31

+1

链接被再次破坏,但我猜这是一回事:https:/ /github.com/Willet/ObjectListProperty – 2014-05-11 11:28:50

2

按照Types and Property Classes doc

的App Engine数据存储支持在数据实体 性质的 组固定值类型。属性 类可以定义一个新类型被 转换为和从底层 值类型,并且该值类型可以被 使用Expando动态 性能和的ListProperty骨料 性质模型直接使用。

我对此的阅读表明,您应该能够将扩展的db.Property指定为ListProperty的item_type。但有一个logged issue,否则表明。

假设这行不通,我认为下一个最好的事情可能是ListProperty的子类,并且手动使用getterval,setter和iterator扩展它,基于“get_value_for_datastore”和“make_value_from_datastore”函数列出“FuzzyDateProperty “成员。

1

你不能这样做 - ListProperty需要一个基本的Python类型,而不是一个属性类。与此同时,物业类别将被附加到一个模型,而不是另一个物业。

+0

尼克 - 是否有可能对数据存储区值类型进行子类化,以便它在对象与其数据存储区表示之间进行转换? – 2010-11-19 22:29:57

+0

像这样做:http://soc.googlecode.com/hg/thirdparty/google_appengine/google/appengine/api/datastore_types.py – 2010-11-19 23:51:30

+0

@Fraser不,因为ListProperty不对属性进行操作。你必须继承ListProperty的子类并让它进行转换。 – 2010-11-22 01:54:06