如何在django视图中优化我的数据库查询集

时间:2013-09-21 15:45:09

标签: python django query-optimization django-queryset

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

我通过一个查询获得所有博客帖子。结果我得到一个查询集。有了这个我做了一些更多的动作。但是每次动作,django debbuger工具栏告诉我,它会一次又一次地击中数据库。

以下是观点:

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)
    )

1 个答案:

答案 0 :(得分: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