GAEのListPropertyについて
今日、現在絶賛開発中のShareSRCVersion2にタグ機能を実装しました。
そのときに使ったのがListPropertyで、なかなか面白いので紹介します。
クラスでデータストアモデルを設計するときには、
class TestData(db.Model): namelist = db.ListProperty(item_type=str)
このような書き方をします。
item_typeはリストの中身の型。
つまり、
namelist = ["apple","android","docomo"]
というような文字型のリストであればitem_typeはstrになります。
データを取り出すときは、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