2017-08-17 11 views
0

サイトマップテンプレートでget_absolute_urlを使用しています。 sitemap.xmlではなく、すべてのリンクを表示するサイトレイアウトのページ。私は基本的にすべてのページオブジェクトを取得し、get_absolute_urlを使用してテンプレート内でそれらを繰り返します。Django get_absolute_urlクエリ

すべてのリンクでデータベースが1回ヒットすることがわかりました。どのようにクエリを減らすのですか?

私は2つの解決策を考え、私は最適な方法を知らない:

  1. はジャンゴからサイトマップフレームワークを使用します。私はサイトマップフレームワークもget_absolute_urlを使用していることを知っています。 sitemap.xmlが生成されたときにクエリの量を確認できませんでした(デバッグツールバーが表示されません)。
  2. 保存方法カスタムを書き、はget_absolute_url

編集使用して、データベース内の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

sitemap.xmlと私のサイトマップページに違いがないはずなので、get_absolute_urlを使うことが重要だと思います。 [保存]カスタム

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つのクエリではなく、1つのリンクのみが使用されます。

関連する問題