Как оптимизировать 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)?

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

Вернуться на верх