Как оптимизировать Default Django oscars App Views Особенно каталог App Views?
Я использую Django oscar(2.1. 1), и я хочу сделать оптимизацию запросов на Django Oscars по умолчанию Apps Views, особенно на представление каталога для class ProductDetailView(DetailView).
и class ProductCategoryView(TemplateView).
и в App 'Offer' class RangeDetailView(CoreRangeDetailView):.
Я знаю, что используя select_related() и prefetch_related() я могу оптимизировать представления, но я не понимаю, какую конкретную функцию я должен переопределить, чтобы оптимизировать эти представления, особенно для Product Table.
Я покопался в Django Oscars catalog App и обнаружил, что основные роли и запросы выполняются 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 с помощью select related и prefetch related?
- Есть ли другие предложения по оптимизации этих представлений?
Как вы можете видеть здесь в панели отладки django-silk ProductDetailView(DetailView) делает 160 запросов и здесь ProductCategoryView(TemplateView)?
Пожалуйста, дайте предложения и рабочий пример (если возможно), чтобы я мог добиться того же и оптимизировать поведение по умолчанию.