Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'ListSerializer' when serializing a queryset using Django Rest Framework

I have a slightly complicated APIView which makes that I can't use a generic ListAPIView to return a queryset. But I can't seem to simply serialize a simple Django queryset using a ModelSerializer, even when I set many=True.

Somehow this doesn't work:

serializers.py:

class SomeModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = SomeModel
        fields = ['some_field']

views.py:

from rest_framework.response import Response

class SomeAPIView(APIView):
    serializer_class = SomeInputSerializer

    def post(self, request, format=None):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            # first some business logic, then return results
            results = SomeModel.objects.all()
            output_serializer = SomeModelSerializer(results, many=True)
            return Response(output_serializer.data)

All I keep getting is: 'ListSerializer' object is not iterable.

What am I doing wrong?

Error:

/projectfolder/venv/lib/python2.7/site-packages/django/template/defaulttags.py in render
            try:
                values = self.sequence.resolve(context, True)
            except VariableDoesNotExist:
                values = []
            if values is None:
                values = []
            if not hasattr(values, '__len__'):
                values = list(values) ...
            len_values = len(values)
            if len_values < 1:
                return self.nodelist_empty.render(context)
            nodelist = []
            if self.is_reversed:
                values = reversed(values)

values = list(values) seems to be responsible for the error

like image 805
Vincent van Leeuwen Avatar asked Jun 15 '26 01:06

Vincent van Leeuwen


2 Answers

Was running into the same problem as you did. I found a quick and simple fix for the error: Copy the serializer data to a new array and return that.

results = SomeModel.objects.all()

output_serializer = SomeModelSerializer(results, many=True)    
data = output_serializer.data[:]

return Response(data)

This works for me, hopefully for you as well.

like image 174
D. Peter Avatar answered Jun 17 '26 23:06

D. Peter


Below works for me using an as_view() url:

 class ListCreateMemberViewSet(generics.ListCreateAPIView):
        """
        API endpoint that allows multiple members to be created.
        """
        queryset = Member.objects.none()
        serializer_class = MemberSerializer

    def get_queryset(self):
         queryset = Member.objects.all()
         return queryset

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data, many=isinstance(request.data, list))
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        results = Member.objects.all()
        output_serializer = MemberSerializer(results, many=True)
        data = output_serializer.data[:]
        return Response(data)
like image 27
ncole458 Avatar answered Jun 18 '26 01:06

ncole458



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!