Django -Rest-Framework: нет атрибута HelloViewSet - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь создать простой REST API. Я пробовал добавить вьюсет, почему-то получаю ошибку, что такого атрибута нет. Если я удалю набор просмотра и просто запустил его с помощью APIView, он загрузится нормально. Я застрял. В чем может быть проблема? Что мне делать, чтобы он работал?

Вот ФАЙЛ rest_profiles.views.py:

from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .serializers import HelloSerializer
# Create your views here.


class HelloApiView(APIView):
    '''Test API View'''

    serializer_class = HelloSerializer

    def get(self, request, format=None):
        '''Returns a list of API features'''
        an_apiview = [
            'Uses HTTP methods as functions (get, psot, put, patch, delete)',
            'Similar to Django View',
            'Mapped manually to URLs'
        ]

        return Response({'message': 'Hello from HelloAPIVIew', 'an_apiview': an_apiview})

    def post(self, request):
        '''Create Hello Message'''
        serializer = HelloSerializer(data=request.data)

        if serializer.is_valid():
            name = serializer.data.get('name')
            message = 'Hello {0}'.format(name)
            return Response({'message': message})

        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def put(self, request):
        '''Handles Updates'''
        serializer = HelloSerializer(data=request.data)
        return Response({'message': 'put'})

    def patch(self, request, pk=None):
        '''Handles partial Updates'''
        serializer = HelloSerializer(data=request.data)
        return Response({'message': 'patch'})

    def delete(self, request, pk=None):
        '''Handles deleting items'''
        serializer = HelloSerializer(data=request.data)
        return Response({'message': 'delete'})

    class HelloViewSet(viewsets.ViewSet):
        '''Test API Viewset'''

        def list(self, request):
            '''Return Hello Message'''

            a_viewset = [
                'Uses Actions (list, create, retrieve, update, partial_update)',
                'automatically maps to URLs using Router',
                'More functionality with less code'
            ]

            return Response({'message': 'Hello', 'a_viewset': a_viewset})

и вот файл urls.py:

from django.conf.urls import url
from django.conf.urls import include
from rest_framework.routers import DefaultRouter
from . import views

router = DefaultRouter()
router.register('hello-viewset', views.HelloViewSet,
                base_name='hello-viewset')


urlpatterns = [
    url('hello-view/', views.HelloApiView.as_view()),
    url('', include(router.urls))
]

В чем может быть проблема? И возможный обходной путь?

1 Ответ

0 голосов
/ 06 мая 2020

Если ваш код вставлен правильно, похоже, что ваш HelloViewSet - это внутри ваш HelloApiView.

Отступы важны в Python. Вам необходимо удалить этот код:

class HelloViewSet(viewsets.ViewSet):
    '''Test API Viewset'''

    def list(self, request):
        '''Return Hello Message'''

        a_viewset = [
            'Uses Actions (list, create, retrieve, update, partial_update)',
            'automatically maps to URLs using Router',
            'More functionality with less code'
        ]

        return Response({'message': 'Hello', 'a_viewset': a_viewset})

Это поместит его прямо в ваш модуль views, чтобы его можно было импортировать.

...