2016-04-01 10 views
0

皆さんは、テンプレートでget_absolute_urlを使用することは非常に良い習慣であることを誰もが教えています。しかし、私の場合、それは単一のページ上のデータベースに多くの同じクエリを引き起こします。 ここに私が開発しなければならないURLの構造があります(顧客がすでにWebサイトで働いているので変更できません。私はURLを変更するとGoogleがそれを好きにしません) - mysite/category/subcategory/product_slug.html URLパターンのコードは次のとおりです。ページ(django)で毎回get_absolute_urlを呼び出さないようにするには?

from django.conf.urls import url 

からです。インポートビュー

urlpatterns = [ 
    url(r'^(?P<parent_category_slug>[\w-]+)/(?P<category_slug>[\w-]+)/(?P<slug>[\w-]+)\.html$', views.ProductDetailView.as_view(), name='product_detail'), 
    url(r'^(?P<parent_slug>[\w-]+)/(?P<slug>[\w-]+)$', views.ProductListView.as_view(), name='products_of_category'), 
    url(r'^(?P<slug>\w+)$', views.SubCategoryListView.as_view(), name='sub_category'), 
    url(r'^$', views.CatalogIndexListView.as_view(), name='index'), 
] 

そしてここではget_absolute_urlのコードは、製品のモデルである:私は個人用サイト/カテゴリ/サブカテゴリに行くとき

ので
def get_absolute_url(self): 
    return reverse('product_detail', kwargs={'slug':self.slug, 'parent_category_slug':self.product_category.category_parent.slug, 
              'category_slug':self.product_category.slug}) 

、私はすべての製品はサブカテゴリに属してご覧ください。これはリスト(実際にはテーブル、画像、タイトルなど)です。 すべての画像とタイトルは商品のURLでなければなりません。 は、ここではget_absolute_urlが繰り返し呼び出されるためので、結果には、私は、本当にデータベースへのクエリの多くを持って

e {% for product in products %} 

        <tr> 
         <td class="product_name_list"> 
          <a href="{{ product.get_absolute_url }}">{{ product.product_name }}</a> 
         </td> 
         <td class="product_article_list">{{ product.product_article }}</td> 
         {% if product.product_main_image %} 
          <td class="product_image_list"><a href="{{ product.get_absolute_url }}" ><img src='{{ product.product_main_image.url}}' alt=""></a></td> 
         {% else %} 
          <td class="product_image_list"><a href="{{ product.get_absolute_url }}" ><img src='{% static "images/empty.gif" %}' alt=""></a></td> 
         {% endif %} 

         <td class="product_request_list"><a href="#">Запросить</a></td> 
        </tr> 

      {% endfor %} 

テンプレート

内のコードの一部です。

これを避けてください。私はデフォルトのマネージャクラスを 'get_related()'に設定しようとしましたが、すべてのインスタンスがget_absolute_urlメソッドを何度も何度も呼び出すため、愚かではありませんでした。

ありがとうございます!お電話の際は、そのよう

答えて

0

あなたは両方を使用することができます。これにより、この

from django.utils.functional import cached_property 

# You can either use it convert `get_abolute_url` method to property 
@cached_property 
def get_absolute_url(self): 
    return reverse(
     'product_detail', kwargs={ 
      'slug':self.slug, 
      'parent_category_slug':self.product_category.category_parent.slug, 
      'category_slug':self.product_category.slug}) 

# or decorate the method with different name so that you can use both 

cached_absolute_url = cached_property(get_absolute_url) 

を解決するために、Djangoのcached_propertyデコレータを使用することができ、

object.get_absolute_url() 

object.cached_absolute_url 

cached_propertyは、メソッドの値をキャッシュしますもう一度、全体のメソッドを実行する代わりに、キャッシュされた値を直接返します。

+0

おかげさまで、ありがとうございます。今日は試してみます –

+0

答えに「+」を追加できません。あなたの答えは本当に必要なものではありませんでしたが、依然として非常に役に立ちました。 私の意見では、{%url%}を使用し、クエリセットで 'select_related'、 'prefetch_related'を使用する必要がありました。 –

+0

urlタグの使用は 'get_absolute_url'と同じです。実際には、モデルオブジェクトのDRYリンク生成のために 'url'タグに' get_absolute_url'を使うことがよくあります。 – v1k45

関連する問題