2013-09-21 41 views
2

我已經寫了一個小博客腳本作爲django應用程序。我認爲在單篇文章中我有很多要求。但我不知道如何減少它們。我如何在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) 
    ) 

回答

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 
+1

你還需要添加一些錯誤的情況下,檢查你正在尋找具有最早或最新的發佈日期的文章:) – abeinstein

+1

真棒,謝謝。 :)和@abeinstein,謝謝,我會牢記在心。 – danbruegge