Определение пользовательской конечной точки API списка для ModelViewset, не распознаваемой как действие «список» и не применяющей фильтрацию страниц / заказов - PullRequest
0 голосов
/ 04 апреля 2020

После того, как я обновил до DRF версии 3.9.4, моя конечная точка "list_detail" перестала работать, жалуясь, что не распознала параметры страницы и поля заказа, которые работали раньше. Кажется, проблема в том, что возвращаемая схема не принимает страницы или поля заказа.

Для ясности, это не конечная точка детализации. Просто перечислите конечную точку, которая возвращает больше деталей в каждом результате конечной точки в списке. Для поддержки обеих конечных точек

GET /api/wit/volume/list/
GET /api/wit/volume/list_detail/

я использую как нумерацию страниц, так и фильтр / упорядочение

'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend', 'rest_framework.filters.OrderingFilter')

У меня есть представление на основе ModelViewSet, где views.MultiSerializerModelViewSet - просто настройка, которая допускает 2 типа списка конечные точки API. list и list_detail, где list_detail просто возвращает более подробную версию каждого объекта в списке

class MultiSerializerModelViewSet(viewsets.ModelViewSet):
    '''A ModelViewSet that supports different serializers for different actions '''
    serializer_class_dict = {}

    def get_serializer_class(self):
        return self.serializer_class_dict.get(self.action, self.serializer_class)

Я не думаю, что вышеуказанная настройка вызывает проблему, но по крайней мере ранее действие было установлено в 'list_detail 'и я смог использовать тип Serializer, который вернул больше деталей, как указано выше.

class VolumeViewSet(views.MultiSerializerModelViewSet):
    serializer_class_dict = {
        'read_detail': volserializers.VolumeDetailSerializer,
        'list_detail': volserializers.VolumeDetailSerializer,
    }

@list_route()
def list_get(self, request, *args, **kwargs):
    '''Get list '''
    return super(VolumeViewSet, self).list(request, *args, **kwargs)

Я попытался изменить его на

@action(method=['get'])

Проблема заключается в том, что действие для этой конечной точки установлено «list_detail» вместо «list». И код, который, по-видимому, генерирует представление схемы, - это жесткий код для проверки действия == 'list' перед добавлением страницы и фильтрации.

Итак, вопрос в том, как определить конечную точку "list_detail", который имеет метод = 'GET' и все еще может поддерживать разбиение на страницы и фильтрацию / упорядочение в DRF 3.9.4?

...