2010-11-19 127 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