как получить схему разбивки на страницы на основе сериализатора (drf-yasg) - PullRequest
0 голосов
/ 24 апреля 2020

В настоящее время я использую LimitOffsetPagination на drf и документирую API с помощью drf-yasg.

Я написал такой вид:

class MyViewSet(GenericViewSet):
    @action(detail=False, methods=['get'])
    def submodel1(self, request):
        queryset = SubModel1.objects.filter(user=request.user)
        queryset = self.paginate_queryset(queryset.all())

        serializer = SubModel1Serializer(queryset, many=True)
        return self.get_paginated_response(serializer.data)

    @action(detail=False, methods=['get'])
    def submodel2(self, request):
        queryset = SubModel2.objects.filter(user=request.user)
        queryset = self.paginate_queryset(queryset.all())

        serializer = SubModel2Serializer(queryset, many=True)
        return self.get_paginated_response(serializer.data)

Теперь я хотел бы документировать его используя swagger_auto_schema.

Интересно, есть ли способ автоматически сгенерировать / добавить разбитую на страницы схему и параметры ответов в этих представлениях действий.

Если я использую SubModel1Serializer(many=True) в swagger_auto_schema(responses={...}), схема ответа будет отображаться только в виде массива SubModel1s (или 2s) без полей, таких как prev, next, items.

Спасибо.

1 Ответ

0 голосов
/ 25 апреля 2020

Решение состояло в том, чтобы иметь несколько наборов запросов и сериализаторов в наборе.

    querysets = {
        'submodel1': SubModel1.objects.all(),
        'submodel2': SubModel2.objects.all()
    }
    serializer_classes = {
        'submodel1': SubModel1Serializer,
        'submodel2': SubModel2Serializer
    }

    def get_queryset(self):
        if self.action in self.querysets:
            return self.querysets[self.action]
        return super().get_queryset()

    def get_serializer_class(self):
        if self.action in self.querysets:
            return self.serializer_classes[self.action]
        return super().get_serializer_class()

, и это работало как волшебный c. (❁'◡`❁)

...