Как оптимизировать просмотры приложений Django oscars по умолчанию, особенно просмотры приложений каталога?

Я использую 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"))
  • Можете ли вы привести один общий пример для этих трех представлений, о которых я рассказал выше, и как я могу оптимизировать его в общем виде, используя модель продукта Django oscar по умолчанию, используя связанные с выбором и связанные с предварительной выборкой?
  • Любые другие предложения по оптимизации этих представлений?

Как вы можете видеть здесь, на панели инструментов отладки django-silk, ProductDetailView(DetailView) выполняет 160 запросов , а здесь ProductCategoryView(TemplateView)?

Пожалуйста, дайте предложения и рабочий пример (если возможно), чтобы я мог добиться того же и оптимизировать поведение по умолчанию.

0 ответов

Другие вопросы по тегам