2

django アプリとして小さなブログ スクリプトを作成しました。単一の記事ビューでは、多くのリクエストが必要だと思います。しかし、私はそれらを減らす方法がわかりません。

1 つのクエリですべてのブログ投稿を取得します。その結果、クエリセットを取得します。これで、さらにいくつかのアクションを実行します。しかし、すべてのアクションで、django デバッガーのツールバーは、データベースに何度もヒットすることを教えてくれます。

ビューは次のとおりです。

def single(request, slug):
    articles = Article.objects.all()

    article = articles.filter(slug=slug)[0]

    newer_article = list(articles.filter(release_date__gt=article.release_date))[-1:]
    older_article = articles.filter(release_date__lt=article.release_date)[:1]

    return render_to_response(
        'article/single%s.html' % extend,
        locals(),
        RequestContext(request)
    )
  • 最初のヒットで、現在の記事を取得します。
  • 2番目と3番目のヒットは、前後の記事を取得することです

1 つのデータベース ヒットだけで同じ結果を得るソリューションはありますか?

結果:

1 つのクエリのみの新しいバージョン。

def single(request, slug):
    articles = list(Article.objects.all())

    for i, a in enumerate(articles):
        if a.slug == slug:
            article = a

            if (i-1) >= 0:
                newer_article = articles[i-1]
            else:
                newer_article = None

            if (i+1) < len(articles):
                older_article = articles[i+1]
            else:
                older_article = None

            break

    return render_to_response(
        'article/single%s.html' % extend,
        locals(),
        RequestContext(request)
    )
4

1 に答える 1

3

次のように、1 つのクエリに減らすことができます。

articles = list(Article.objects.order_by('release_date'))

for index, art in enumerate(articles):
    if art.slug == slug:
        article = art
        newer_article = articles[index+1]
        older_article = articles[index-1]
        break
于 2013-09-21T17:49:52.560 に答える