Home > Blockchain >  Django rest serializer can't handle object - TypeError: Object of type Hero is not JSON seriali
Django rest serializer can't handle object - TypeError: Object of type Hero is not JSON seriali

Time:03-23

I have the below simple rest api set up in Django. Calling the url http://127.0.0.1:8000/listheros/ returns

TypeError: Object of type Hero is not JSON serializable

for a reason I can't seem to figure out.

# 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

CodePudding user response:

You don't serialize your queryset of heroes. Your ListHeroes api view should looks like below:

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)

You can also use generics ListApiView instead of APIView:

from rest_framework.generics import ListAPIView

class ListHeros(ListAPIView):
    queryset = Hero.objects.all().order_by('name')
    serializer_class = HeroSerializer
  • Related