昨今のソーシャルアプリではタグ機能はあたりまえ。そのタグ機能を Google App Engine で実装するのを助けるモジュールに、taggable-mixin があります。
- taggable-mixin - A mixin class that adds taggability to Google AppEngine Model classes. - Google Project Hosting
使い方の紹介。まずは Taggable クラスを継承したモデルを作成します。
from google.appengine.ext import db from taggable import Taggable class Entry(db.Mode, Taggable): title = db.StringProperty() content = db.TextProperty() created = db.DateTimeProperty(auto_now_add=True) def __init__(self, parent=None, key_name=None, app=None, **entity_vlaues): db.Model.__init__(self, parent, key_name, app, **entity_values) Taggable.__init__(self)
タグの設定は Taggable クラスが提供する tags プロパティで行います。
# 新しいモデルにタグを設定する場合 entry = Entry(title="テスト", content="これはテストです。") key = entry.put() entry.tags = "foo, bar" # タグを設定 # 既に保存されているモデルにタグを設定する場合 entry = Entry.get(key) entry.tags = "hoge, fuga" # タグを入れ替え
新しいモデルのタグを設定するとき1度 put しているのは、タグを保存するときにモデルの key を必要としているためです。タグは既にデータストアに保存されているモデルにしか設定できません。ちょっと違和感。
また、tags プロパティにタグを設定すると、自動でデータストアに保存されます。put を呼び出す必要はありません。これにもちょっと違和感あり。
タグの取得には Tag クラスを使います。
from taggable import Tag # foo タグを取得 tag = Tag.get_by_name("foo") # タグを登録数が多い順に取得 tags = Tag.get_tags_by_frequency(limit=50) # タグを名前でソートして取得 tags = Tag,get_tags_by_name(limit=50, ascending=True) # 人気タグを取得 tags = Tag.popular_tags(limit=10)
taggable-mixin はユーザーでタグを絞り込むようなことができないので、全ユーザーでタグを共有するアプリで使った方がいいです。
あと、タグをもとにモデルを検索するメソッドが提供されていないので、自分で実装しなければいけません。こんな感じ。
# foo タグの付いたモデルを取得する tag = Tag.get_by_name("foo") model = Entry.all().filter("__key__ IN", tag.tagged)
tagged プロパティには、タグがつけられているモデルの key が格納されています。詳しくは taggable-mixin のソースコードを読んでください。ソースコードは200行程度なので、すぐ読み終わります。
個人的に、taggable-mixin はまだまだ機能が足りていません。今後に期待です。もしくは、自分で実装しようかな。時間があれば、ですけどね。