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

Python 如何在django视图中优化数据库查询集,python,django,query-optimization,django-queryset,Python,Django,Query Optimization,Django Queryset,我已经写了一个小博客脚本作为django应用程序。我想在单篇文章中我有很多要求。但我不知道如何减少它们 我通过一个查询获得所有博客帖子。结果我得到了一个查询集。有了这个,我做了更多的动作。但django debbuger工具栏告诉我,每次操作都会一次又一次地访问数据库 以下是视图: def单个(请求、段塞): articles=Article.objects.all() article=articles.filter(段塞=段塞)[0] 更新的文章=列表(articles.filter(rele

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

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

以下是视图:

def单个(请求、段塞):
articles=Article.objects.all()
article=articles.filter(段塞=段塞)[0]
更新的文章=列表(articles.filter(release\u date\u gt=article.release\u date))[-1:]
旧的文章=文章.filter(发布日期=文章.发布日期)[:1]
返回render\u to\u响应(
'项目/单个%s.html'%1!''扩展,
本地人(),
请求上下文(请求)
)
  • 随着第一次点击,我得到了当前的文章
  • 第二个和第三个目标是在文章前后获得文章
是否有一种解决方案可以只命中一个数据库就获得相同的结果

结果:

新版本只支持1个查询

def单个(请求、段塞):
articles=list(Article.objects.all())
对于i,列举(文章)中的a:
如果a.slug==slug:
第条=a
如果(i-1)>=0:
更新的文章=文章[i-1]
其他:
更新的文章=无
如果(i+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

您还需要添加一些错误检查,以防您正在查找的文章具有最早或最新的发布日期:)太棒了,谢谢。:)还有@abeinstein,谢谢,我会记住的。