django对象不能使用serializers.serialize进行迭代

时间:2013-05-19 22:14:16

标签: django

我收到以下错误,

模板'对象不可迭代

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

但是,我正在使用'get'所以我不明白为什么我会收到此错误。有什么想法吗?

3 个答案:

答案 0 :(得分:17)

那是因为你没有传递iterable nor a QuerySet,而是传递了一个Template对象。如果要序列化该单个对象,可以这样做:

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

更新:建议改为使用filter

如果pk不存在,还可以考虑使用filter而不是get来避免可能的异常。这样您就不需要括号,因为它是QuerySet对象

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

希望它有所帮助!

答案 1 :(得分:0)

关注Paulo Bu示例。有时候我们想使用get,因为它提供了其他功能,比如get_object_or_404(),这个函数使用了引擎,所以一个小的解决方法是将对象包含在列表中。

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

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)

答案 2 :(得分:0)

如果你想返回一个不在列表中的对象,只需简单地这样做:

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

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

注意:

您不需要在序列化程序中添加 many=True :

serializer = CustomSerializerClass(queryset)