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)
Он выполняет следующий порядок действий:
-
Получает QuerySet, который мы указали в атрибуте queryset класса MyViewSet
-
Обрабатывает queryset. Для этого он по очереди передаёт queryset в queryset процессоры, указанные в атрибуте queryset_processors класса MyViewSet
-
Отправляет queryset в пагинатор, получая пагинированный queryset, количество объектов в queryset (ПОСЛЕ ОБРАБОТКИ QUERYSET ПРОЦЕССОРАМИ!)
-
Сериализует пагинированный queryset
-
Собирает response