ReferenceProperty で参照しているエンティティ群は「後方参照」で逆参照できる

後方参照を使えば、よりシンプルなプログラムを書くことができるようです。


次のような ReferenceProperty を用いたモデルが定義されているとします。

#
# models.py
#
from google.appengine.ext import db

class Site(db.Model):
    name = db.StringProperty()

class Article(db.Model):
    title = db.StringProperty()
    site = db.ReferenceProperty(Site)  # Site を参照


特定の Site エンティティを参照している Article エンティティ群を取得したい。
今までは最初に Site エンティティを取得して、それを引数に、Query.filter() メソッドで Article エンティティ群を取得していました。

import models

# 特定の Site エンティティを取得
site = models.Site.all().filter('name =', u'ShobonEngineの日記').get()
# |site| を参照している Article エンティティ群を取得
article_query = models.Article.all().filter('site =', site)
for article in article_query:
    print article.title


ReferenceProperty後方参照という機能を使えば、Site エンティティを参照している Article エンティティ群を直接取得することができます。

import models

# 特定の Site エンティティを取得
site = models.Site.all().filter('name =', u'ShobonEngineの日記').get()
# |site| を参照している Article エンティティ群を取得
for article in site.article_set:  # 後方参照プロパティ
    print article.title

後方参照プロパティmodelname_set(小文字のモデルクラス名の後に「_set」を付けたもの)で得られる Query インスタンスです。
したがって、site.article_setArticle 群の Query が取得されます。
Query インスタンスが返されるので、site.article_set.order('title') といった使い方ができます。


参考:http://code.google.com/intl/ja/appengine/docs/python/datastore/entitiesandmodels.html#References

プログラミング Google App Engine

プログラミング Google App Engine