需要帮助在DJango中实现基本序列化程序

时间:2016-04-23 05:13:39

标签: python json django serialization

我正在尝试实施基本序列化程序,我正在关注“ http://www.django-rest-framework.org/api-guide/serializers/#baseserializer ”。

我的urls.py:

 url(r'^auth/myuser/(?P<pk>[0-9]+)/profile/$', UserProfileViewSet.as_view({'patch':'update'}), name='user-profile'),

Views.py:

class UserProfileViewSet(viewsets.ModelViewSet):
    queryset = CustomUser.objects.all()
    serializer_class = UserProfileSerializer

    def get(self,request,pk,*args,**kwargs):
        user_instance = CustomUser.objects.get(pk=pk)
        dashboard_data = UserProfileSerializer(user_instance)
        content = {'result': dashboard_data}
        return Response(content)

Serializers.py:

class UserProfileSerializer(serializers.BaseSerializer):
    def to_representation(self,obj):
            return{
            'email':obj.email,
            'first_name':obj.first_name,
            'last_name':obj.last_name,
            'date_of_birth':obj.date_of_birth,
            'gender':obj.get_gender_display(),
            'location':obj.location,
            'calling_code':obj.callingcode,
            'phone_primary':obj.phone_primary,
            'phone_secondary':obj.phone_secondary,
            'website':obj.website
            }

但是我收到错误“用户对象不是JSON可序列化的”,并且我找不到用户obj的任何不可序列化的属性。

我已经在SO上找到了一些答案,但我没有在django rest framework api guide中找到任何类似的步骤。所以寻找与api-guide同步的解决方案。

2 个答案:

答案 0 :(得分:1)

我猜你必须在返回之前以JSON格式呈现响应。

class JSONResponse(HttpResponse):
"""
An HttpResponse that renders its content into JSON.
"""
def __init__(self, data, **kwargs):
    content = JSONRenderer().render(data)
    kwargs['content_type'] = 'application/json'
    super(JSONResponse, self).__init__(content, **kwargs)

class UserProfileViewSet(viewsets.ModelViewSet):
    queryset = CustomUser.objects.all()
    serializer_class = UserProfileSerializer

    def get(self,request,pk,*args,**kwargs):
        user_instance = CustomUser.objects.get(pk=pk)
        dashboard_data = UserProfileSerializer(user_instance)
        content = {'result': dashboard_data}
        return JSONResponse(content, status=200)

您需要为此进行以下导入,

from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser

如果这不起作用,只需尝试将dashboard_data传递给JSONResponse函数

答案 1 :(得分:1)

<强>串行器:

您需要的是ModelSerializer

  

ModelSerializer类提供了一种快捷方式,可让您自动创建一个Serializer类,其fields类与“模型”字段对应。

class UserProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = CustomerUser
        fields = '__all__'

我已将fields属性设置为__all__,表示模型中的所有字段都已序列化。但是,您还可以指定要包含exaclty的字段:

fields = ('email', 'first_name', 'last_name',) # etc.

<强>视图集:

第二点是关于你不需要实现ModelViewSet方法的get,因为它已经为你实现了。您只需要声明querysetserializer_class就像您已经完成的那样:

class UserProfileViewSet(viewsets.ModelViewSet):
    queryset = CustomUser.objects.all()
    serializer_class = UserProfileSerializer