Skip to content

SmartViewSet

Представляет из себя модификацию DRF ViewSet.

Из коробки содержит в себе SmartListMixin, который позволяет быстро создать pipeline обработки QuerySet в зависимости от request.

Пример использования:

python

from advantage.drf.viewsets import SmartViewSet
from advantage.drf.queryset.processors import (QuerysetProcessorFiltersGeneric, QuerysetProcessorSortersGeneric, QuerysetProcessorSearchGeneric)


class MyViewSet(SmartViewSet):  
    queryset = MainModel.objects.all() # Набор объектов, которые будут отправляться при запросе (аналогично DRF ViewSet)
    serializer_class = MainModelSerializer # Сериалайзер, который будет сериализовывать объекты при отправке на фронт (аналогично DRF ViewSet)
    queryset_processors = [  
        QuerysetProcessorFiltersGeneric,  
        QuerysetProcessorSortersGeneric,  
    ] # Обработчики QuerySet

После того, как мы поместим MyViewSet в DRF default router у нас появиться 1 endpoint - smart_list, этот как раз таки и есть SmartListMixin.

python

class SmartListMixin:  

    @action(detail=False, methods=['post'])  
    def smart_list(self, request, *args, **kwargs):  
        queryset = self.process_queryset(self.get_queryset())  
        queryset, queryset_count, num_pages = self.paginate_queryset(queryset)  
        serializer = self.get_serializer(queryset, many=True)  
        response = {  
            'count': queryset_count,  
            'max_pages': num_pages,  
            'results': serializer.data,  
        }  
        return Response(response)

Он выполняет следующий порядок действий:

  1. Получает QuerySet, который мы указали в атрибуте queryset класса MyViewSet

  2. Обрабатывает queryset. Для этого он по очереди передаёт queryset в queryset процессоры, указанные в атрибуте queryset_processors класса MyViewSet

  3. Отправляет queryset в пагинатор, получая пагинированный queryset, количество объектов в queryset (ПОСЛЕ ОБРАБОТКИ QUERYSET ПРОЦЕССОРАМИ!)

  4. Сериализует пагинированный queryset

  5. Собирает response