2

我写了一个小博客脚本作为 django 应用程序。我认为在单篇文章视图中我有很多要求。但我不知道如何减少它们。

我通过一个查询获得所有博客文章。结果我得到了一个查询集。有了这个,我做了更多的动作。但是对于每一个动作,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)
    )
  • 随着第一次点击,我得到了当前的文章。
  • 第二次和第三次命中是获取文章前后

是否有一种解决方案可以仅在一个数据库命中时获得相同的结果?

结果:

仅 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

您可以将其减少为一个查询,如下所示:

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 回答