0

我正在使用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)?

请提供建议和工作示例(如果可能),以便我可以实现相同并优化默认行为。

4

0 回答 0