GAEのListPropertyについて

今日、現在絶賛開発中のShareSRCVersion2にタグ機能を実装しました。
そのときに使ったのがListPropertyで、なかなか面白いので紹介します。


クラスでデータストアモデルを設計するときには、

class TestData(db.Model):
       namelist = db.ListProperty(item_type=str)

このような書き方をします。
item_typeはリストの中身の型。
つまり、

namelist = ["apple","android","docomo"]

というような文字型のリストであればitem_typestrになります。


データを取り出すときは、db.Query(データストア名).filter()を使って面白いことが出来ます。たとえば…

db.Query(TestData).filter("namelist =", "android")

このように書くと、"android"という値がnamelistにある要素を取得することができます。
つまり、

>>> db.Query(TestData).filter("namelist =", "android").get().namelist
["apple","android","docomo"]

こういうことですね。


これでタグ機能及びタグ検索機能を実装することができます。
タグ検索の場合は、全体のタグをもつ新しいデータストアを設計する必要があります。

class Tags(db.Model):
    Tagname = db.StringProperty()

Tags(Tagname="python").put()

このようにして、たとえばpythonというタグで検索を書けるときには、パラメータかなにかでタグ名をわたして、

tag = self.request.get("tag")
filter = db.Query(CodeData).filter("tags =", tag)
data = filter.fetch( filter.count() )
for item in data:
    print item.title

このようなコードを書けば、pythonというタグがあるコードのタイトルを表示させることができるわけです。


もし、リストの値が数値ならば、filter()メソッドで論理演算子をつかうことができます。

db.Query(DBname).filter("valuelist >", 10)

この場合は、リストの各数値が10より大きいかどうかを調べるfilterです。


詳しくは以下のURLへどうぞ。


型とプロパティ クラス - Google App Engine
http://code.google.com/intl/ja/appengine/docs/python/datastore/typesandpropertyclasses.html#ListProperty