【发布时间】:2016-07-20 19:11:10
【问题描述】:
每个人都说在模板中使用 get_absolute_url 是非常好的做法。但在我的情况下,它会在单个页面上对数据库产生许多相同的查询。 这是我必须开发的 url 结构(我无法更改它,因为客户已经在使用网站,如果我更改 url,Google 不会喜欢它) - mysite/category/subcategory/product_slug.html 这是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})
因此,当我访问 mysite/category/subcategory 时,我看到所有产品都属于该子类别。这是一个列表(实际上是表格,带有图像、标题等)。 所有图片和标题都必须是产品的网址。 这是模板中的一段代码
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_absolute_url 被重复调用。
请帮助我避免这种情况。我尝试使用“get_related()”设置默认的 Manager 类,但这很愚蠢,显然它没有帮助,因为每个实例都一次又一次地调用方法 get_absolute_url。
提前致谢!
【问题讨论】:
标签: django django-models django-templates django-views