Google App Engine でタグ機能の実装を簡単にする taggable-mixin

昨今のソーシャルアプリではタグ機能はあたりまえ。そのタグ機能Google App Engine で実装するのを助けるモジュールに、taggable-mixin があります。

使い方の紹介。まずは 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 はまだまだ機能が足りていません。今後に期待です。もしくは、自分で実装しようかな。時間があれば、ですけどね。