Как оптимизировать код listview, get_queryset в django

Мне надо отфильтровать объект и вывести его paginate, и получается я делаю это один раз в get_queryset и второй раз, уже в логике get_context_data, поскольку часть данных идет через контекст. Как не обращаться два раза к базе?

views

class OrdersHomeView(ListView):
    paginate_by = 10
    template_name = 'orders/orders_list.html'
    context_object_name = 'orders'

    def get_queryset(self):
        category_filter = self.request.GET.get('category')
        list_orders = Orders.objects.filter(category__category=category_filter)
        return list_orders

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)        
        # здесь второй раз вызывает тоже самое, что в get_queryset, так как ниже идет работа с пагинацией
        category_filter = self.request.GET.get('category')
        list_orders = Orders.objects.filter(category__category=category_filter)
        #paginator
        paginator = Paginator(list_orders, self.paginate_by)
        page = self.request.GET.get('page')
        related = self.checkRelated()
        related_list = []
        if related:
            for x in related:
                modelPath = x.module_name + '.models'
                app_model = importlib.import_module(modelPath)
                cls = getattr(app_model, x.related_class_name)
                for r in orders_page:
                    try:
                        cls2 = cls.objects.get(related_uuid=r.related_uuid)
                        related_get = cls2.get_related_data()
                        related_list.append(related_get)
                    except ObjectDoesNotExist:
                        pass
        context['related_list'] = related_list
        return context

    def checkRelated(self):
        related = Plugins.objects.get(module_name='orders')
        return related.related.all()

Ответы (0 шт):