2017-08-17 73 views
0

我在網站地圖模板中使用get_absolute_url。不是sitemap.xml,而是網站佈局中的一個頁面,顯示所有鏈接。我基本上得到所有頁面對象,並使用get_absolute_url在模板中查看它們。Django get_absolute_url查詢

我發現,每一個鏈接的數據庫被擊中一次。我如何減少查詢?

我想兩種解決方案,但我不知道哪條路是最好的:

  1. 使用從Django的網站地圖框架。我知道sitemap框架也使用get_absolute_url。當生成sitemap.xml時,我無法檢查查詢量(調試工具欄不顯示)。
  2. 編寫自定義的保存方法,並保存URL數據庫,使用get_absolute_url

編輯:

我使用一些簡單的代碼來生成的鏈接頁面:

Views.py:

all_links = mypage.objects.all() 

模板:

<ul> 
{% for link in all_links %} 
<li>li><a href="{{link.get_absolute_url}}">{{link.link_title}}</a></li> 
{% endfor %} 
</ul> 

models.py:

def get_absolute_url(self): 
     if self.submenu: 
      return "/%s/%s/" %(self.submenu.slug,self.slug) 
     elif not self.mainmenu: 
      return "/submenu/%s" % self.slug 
     else: 
      return "/%s/" % self.slug 

EDIT2:

我會打開緩存在生產的時候。我認爲先優化是一件好事。

+0

如果您有請求對象,那麼您可以使用[this](https://docs.djangoproject.com/en/1.11/ref/request-響應/#django.http.HttpRequest.build_absolute_uri)它不會擊中你的數據庫,甚至一次 –

+0

我想要一個我的網站所有可用的URL列表。我不明白如何使用請求對象? –

+1

如果您不顯示正在生成查詢的代碼,我們無法提供幫助。 – Alasdair

回答

0

我認爲使用get_absolute_url很重要,因爲sitemap.xml和我的站點地圖頁面應該沒有區別。我現在的解決方案是這樣的(常開,以更好的解決方案)

我創建了一個模型字段:

absolute_url = models.CharField(max_length=400, blank=True, editable=False) 

然後自定義保存:

def save(self, *args, **kwargs): 
     self.absolute_url = self.get_absolute_url() 
     super(mypage, self).save(*args, **kwargs) 

在我的模板:

<ul> 
    {% for link in all_links %} 
      <li><a href="{{link.absolute_url}}">{{link.menu_title}}</a></li> 
    {% endfor %} 
</ul> 

這節省了我很多的疑問。現在只有一個用於鏈接(而不是每個鏈接1個查詢)