GrantU
GrantU

Reputation: 6555

django object is not iterable using serializers.serialize

I'm getting the following error,

Template' object is not iterable

def get_AJAX(request, id):
    data = serializers.serialize("json", Template.objects.get(pk=id))
    return HttpResponse(data)

However, I'm using 'get' so I don't understand why I'm getting this error. Any ideas?

Upvotes: 14

Views: 16690

Answers (3)

Lutaaya Huzaifah Idris
Lutaaya Huzaifah Idris

Reputation: 3990

If you want to return an Object without it being in a List, just simply do this :

serializer = CustomSerializerClass(queryset) # This queryset is the one with a get()

return Response(status=status.HTTP_201_CREATED, data=serializer.data)

Note :

You don't need to add many=True in the serializer :

serializer = CustomSerializerClass(queryset)

Upvotes: 0

Wolfgang Leon
Wolfgang Leon

Reputation: 703

Following Paulo Bu Example. Sometimes we'd like to use get due it offers other functionalities like get_object_or_404(), this function uses get under the hood, so a little workaround is to enclosed the object in a list.

def get_AJAX(request, id):
    _data = [Template.objects.get(pk=id)] # This is now list.
    data = serializers.serialize("json", _data)
    return HttpResponse(data)

or

def get_AJAX(request, id):
    _data = [get_object_or_404(Template, pk=id)] # This is now list.
    data = serializers.serialize("json", _data)
    return HttpResponse(data)

Upvotes: 1

Paulo Bu
Paulo Bu

Reputation: 29794

That's because you're not passing an iterable nor a QuerySet, you're passing instead a Template object. If you want to serialize that single object you can do it like this:

def get_AJAX(request, id):
    data = serializers.serialize("json", [Template.objects.get(pk=id)])
    return HttpResponse(data)

UPDATE: Recommending using filter instead.

Also consider using filter instead of get in order to avoid possible exceptions if pk doesn't exists. This way you don't need the brackets because it is a QuerySet object

def get_AJAX(request, id):
    data = serializers.serialize("json", Template.objects.filter(pk=id))
    return HttpResponse(data)

Hope it helps!

Upvotes: 27

Related Questions