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
        ......

なにかもっとよい方法がないものかと思っているのですが、アドバイスいただけると幸いです。