Как оптимизировать просмотры приложений 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)?
Пожалуйста, дайте предложения и рабочий пример (если возможно), чтобы я мог добиться того же и оптимизировать поведение по умолчанию.