2014-09-25 49 views
0

我有一些看起來像這樣:什麼輕量級的Django緩存選項有一個簡單的內部循環,在一個會話?

pages = Page.objects.prefetch_related("sections","sections__tiles").all() 
for page in pages: 
    for section in page.sections.all(): 
     for tile in section.tiles.all(): 
      print tile.author 
      # more stuff to build each page 

這擊中SQL層曾經爲初始查詢,然後每一次循環(N + 1)。 但是,SQL查詢的最佳數量是1 +(唯一作者的數量)。

我實現了一個簡單的基於哈希的「作者」現金,並大幅縮短了加載時間。

但它感覺凌亂。有什麼更清潔的選項,用於減少單個事務內的SQL開銷 ?

回答

0

再說一次,如果沒有看到模型,我不能肯定,但我在Django 1.7中測試了這個設置,它應該只用幾個查詢來獲得所有東西。

pages = Page.objects.prefetch_related("sections","sections__tiles").all().select_related(‌​'sections__tiles__author') 
for page in pages: 
for section in page.sections.all(): 
    for tile in section.tiles.all(): 
     print tile.author 
+0

不幸的是,這扭曲了優化SQL的代碼。這裏所需的操作是構建頁面:以另一種方式運行它會令人困惑。 – Bryce 2014-09-25 22:27:36

+0

Ahhh,對不起,我錯過了關於在第一個示例中構建頁面的評論。 – 2014-09-25 22:33:14

+0

您是否嘗試過:pages = Page.objects.prefetch_related(「sections」,「sections__tiles」)。all()。select_related('sections__tiles__author') – 2014-09-25 22:42:29

相關問題