2010-11-19 3 views
1

ListPropertyをサブクラス化されたdb.Propertyタイプを格納するために使用する洗練された方法がありますか?例えばカスタムプロパティのリストプロパティ

this exampleからFuzzyDatePropertyは、データストアに格納されるものintにその属性を変換するget_value_for_datastore()make_value_from_datastore()を使用します。その1つがintがPythonプリミティブなので、ListPropertyFuzzyDatePropertyに作成できるはずです。どうやって?

私の特定のケースでは、クラスとヘルパ関数を定義して、その属性をシリアライズ/デシリアライズする機能を定義しました。実装者がクラスとModelプロパティの間の関係を処理するのではなく、クラスをdb.Propertyとしてカプセル化したいと思います。

答えて

1

@mjhmと@Nickのお勧めのとおり、ListPropertyをサブクラス化して任意のクラスを受け入れました。 ObjectListPropertyという名前のuploaded a generic version to GitHubがあります。私は、パラレル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

+0

@Thomas Fixed!ヘッドアップありがとう –

+1

リンクが再び壊れていますが、これは同じことです:https:/ /github.com/Willet/ObjectListProperty –

2

Types and Property Classes doc

によると、App Engineデータストアは、データエンティティの プロパティの値型の 固定セットをサポートしています。プロパティ クラスは はExpando動的プロパティとListProperty集約 特性モデルを直接使用することができ及び根底 値型と値型から に変換される新しいタイプを定義することができます。

これを読んだことは、ListPropertyのitem_typeとして拡張db.Propertyを指定できるだけであることを示唆しています。しかし、別の方法を示唆するlogged issueがあります。

問題が解決しないと仮定すると、私は次善の策はListPropertyをサブクラス化し、手動でFuzzyDateProperty」とリストの「get_value_for_datastore」と「make_value_from_datastore」機能に基づいて、ゲッター、セッター、およびイテレータでそれを拡張するために、おそらくだと思います"メンバー。

1

あなたはこれを行うことはできません。ListPropertyでは、プロパティクラスではなく、基本的なPython型が必要です。一方、プロパティクラスは、別のプロパティではなく、モデルにアタッチされることが期待されます。

+0

Nick - データストアの値型をサブクラス化して、オブジェクトとそのデータストア表現を変換できるのですか? –

+0

ようこそhttp://soc.googlecode.com/hg/thirdparty/google_appengine/google/appengine/api/datastore_types.py –

+0

@Fraserいいえ、ListPropertyはプロパティで動作しないためです。 ListPropertyをサブクラス化して変換を行わなければなりません。 –

関連する問題