Articleオブジェクトをトラバーサルツリーに自動的に適切に挿入するには、親の__getitem__
メソッドを介してそれらにアクセスするのが最も直接的な方法です。これは、個々の記事にアクセスする場合に問題なく機能します。/Articles/123
リストを表示しているときは、実際には個々の記事をトラバースしているわけではありません。で記事のリストを表示したいのは偶然の一致であるため、このケースはトラバーサル( URIのトラバースに関するもの)/Articles
によって直接カバーされません。。ただし、トラバーサルのように見せるための簡単な修正がいくつかあります。
@view_config(context='resource.ArticleDispatcher')
def article_list(context, request):
all_articles_ids = context.magically_get_ids_of_all_articles()
articles = [context[id] for id in all_articles_ids]
return {'articles': articles}
ここでは、どういうわけか、必要なすべての記事のすべてのIDを知っており、トラバーサルコンテキストに挿入するトラバーサルを介して子供を1つずつ取得します。多くの場合(特にSQLバックエンドの場合)、オブジェクトごとに個別のクエリを発行する必要があるため、これはあまり効率的ではありません。
次に、より現実的な例:トラバーサルコンテキストに記事を手動で挿入します。
@view_config(context='resource.ArticleDispatcher')
def article_list(context, request):
articles = context.adopt_children(request.db.query(Article))
return {'articles': articles}
class ArticleDispatcher(object):
def adopt_children(self, children):
for child in children:
child.__name__ = child.id # actually I'd made __name__ a property of the Article model
child.__parent__ = self
return children
3番目の例:記事に移動しているふりをすることを気にせず、次のようなことを行うだけです。
req.resource_url(ARTICLE_DISPATCHER) + '/' + article.id
この場合、完全なArticleオブジェクトを照会する必要はなく、名前とIDのみを照会できます(状況によってはより高速な場合があります)。
@view_config(context='resource.ArticleDispatcher')
def article_list(context, resource):
name_id_tuples = request.db.query(Article.id, Article.name).all()
return {'articles': name_id_tuples}