Сериализатор Django rest не может обработать объект - TypeError: Объект типа Hero не является JSON сериализуемым

У меня есть нижеприведенный простой rest api, установленный в Django. Вызов url http://127.0.0.1:8000/listheros/ возвращает

TypeError: Объект типа Hero не является JSON сериализуемым

.

по причине, которую я никак не могу понять.

# views.py

from rest_framework.views import APIView
from rest_framework.response import Response

from .serializers import HeroSerializer
from .models import Hero


class ListHeros(APIView):

    def get(self, request, format=None):
        """
        Return a list of all users.
        """
        queryset = Hero.objects.all().order_by('name')
        serializer_class = HeroSerializer
        print('get')
        return Response(queryset)
# urls.py

from django.urls import include, path
from applications.api.views import ListHeros

urlpatterns = [
    path('listheros/', ListHeros.as_view()),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
# serializers.py

from rest_framework import serializers
from .models import Hero


class HeroSerializer(serializers.ModelSerializer):
    class Meta:
        model = Hero
        fields = ('name', 'alias')
# models.py

from django.db import models


class Hero(models.Model):
    name = models.CharField(max_length=60)
    alias = models.CharField(max_length=60)

    def __str__(self):
        return self.name

Вы не сериализуете свой набор героев. Ваше представление ListHeroes api должно выглядеть следующим образом:

class ListHeros(APIView):

def get(self, request, format=None):
    """
    Return a list of all users.
    """
    queryset = Hero.objects.all().order_by('name')
    serializer = HeroSerializer(queryset, many=True)
    return Response(serializer.data)

Вы также можете использовать дженерик ListApiView вместо APIView:

from rest_framework.generics import ListAPIView

class ListHeros(ListAPIView):
    queryset = Hero.objects.all().order_by('name')
    serializer_class = HeroSerializer
Вернуться на верх