1

私はこのようなリソースツリー構造を持っています:

Root
|
|
\-- Article
|     |
|     \-- 1
|     \-- 2
|
\-- User
      |
      \-- 1
      \-- 2

ユーザーが「/Article」にアクセスすると、すべての記事のリストが表示されます。

@view_config(context='resource.ArticleDispatcher', renderer='nothing-related')
def article_list(context, resource):
    articles = request.db.query(Article)
    return {'articles': articles}

しかし、テンプレートでは、データベースから取得したオブジェクト「articles」に名前セットもないため、「req.resource_url(ARTICLE_OBJECT)」を呼び出す方法がないことがわかりました。

このような状況でURLを生成する方法がわかりません...:-(私のデザインは間違っていますか?

4

1 に答える 1

3

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}
于 2013-03-02T21:19:00.703 に答える