我正在使用Django oscar(2.1.1),我想对 Django Oscars 默认应用程序视图进行查询优化,特别是应用程序“优惠”的目录视图class ProductDetailView(DetailView).
和class ProductCategoryView(TemplateView).
应用程序“优惠”class RangeDetailView(CoreRangeDetailView):.
我知道使用 select_related() 和 prefetch_related() 我可以优化视图,但我不明白的是我必须重写哪个特定功能才能优化这些视图,特别是对于产品表。
我深入研究了 Django Oscars 目录应用程序,发现主要角色和查询正在完成,managers.py
所以我尝试像这样覆盖它,但是我需要哪种方法在这里覆盖任何示例?
我尝试的是覆盖此方法:
def base_queryset(self):
"""
Applies select_related and prefetch_related for commonly related
models to save on queries
"""
Option = get_model('catalogue', 'Option')
product_class_options = Option.objects.filter(productclass=OuterRef('product_class'))
product_options = Option.objects.filter(product=OuterRef('pk'))
return self.select_related('product_class', 'mtg_card')\
.prefetch_related('attributes','categories','children', 'product_options', 'stockrecords', 'images') \
.annotate(has_product_class_options=Exists(product_class_options),
has_product_options=Exists(product_options))
def public(self):
"""
Excludes non-public products
"""
return self.filter(is_public=True).select_related('product_class', 'mtg_card')\
.prefetch_related('attributes','categories','children', 'product_options', 'stockrecords', 'images')
这是以通用方式做的正确方法吗?
并在catalogue/views.py
发现这个
class ProductDetailView(CoreProductDetailView):
def get(self, request, **kwargs):
product = self.get_object()
.
.
def get_object(self, queryset=None):
return get_object_or_404(Product.objects.prefetch_related('attributes' , 'product_options').select_related('product_class'),pk=self.kwargs.get("pk"))
- 您能否为我上面提到的这 3 个视图提供一个通用示例,以及如何使用 Django oscar 的默认产品模型(使用选择相关和预取相关)以通用方式对其进行优化?
- 对于优化这些视图还有什么其他建议吗?
正如您在 django-silk 调试工具栏中看到的那样,ProductDetailView(DetailView) 正在执行160 次查询,而ProductCategoryView(TemplateView)?
请提供建议和工作示例(如果可能),以便我可以实现相同并优化默认行为。