Google App Engine/Python でタギングを実現する方法
Google App Engine で、いわゆるタギング( tagging )を実現したいのですが、うまい方法がわからず悩んでいます。
いまは以下のようにしています。
class Tag(db.Model): label = db.StringProperty() class Item(db.Model): name = db.StringProperty() tags_key = db.ListProperty() # リストの要素は Tag のエンティティの key 値。 def getTags(self): tags = [] for tag_key in self.tags_key: label = Tag.get(tag_key).label tag = { 'label' : label, 'url' : urllib.quote(label.encode('utf-8')), } tags.append(tag) return tags
このようにしておいて、Django テンプレートの方で以下のようにしてタグを取り出しています。
<ul class="tags"> {% for tag in item.getTags %} <li><a href="/tag/{{ tag.url }}">{{ tag.label }}</a></li> {% endfor %} </ul>
ただ、ある特定のタグがつけられた Item のエンティティーを取り出すのが以下のようになっていて、若干ややこしいです。
# '/tags/([a-fA-F0-9+%]+)$' のリクエストハンドラー class ViewTag(webapp.RequestHandler): def get(self, tag_url): # URL の中の URL エンコードされたタグのラベルから Tag のエンティティを取得する。 query = Tag.all() query.filter('label = ', tag_url.decode('utf-8')) tag = query.get() # 取得した Tag のエンティティの key 値 を tags_key プロパティに含む Item のエンティティを取得する。 query = Item.all() query.filter('tags = ', tag.key()) items = query.fetch(50) template_values['items'] = items ......
なにかもっとよい方法がないものかと思っているのですが、アドバイスいただけると幸いです。