我正在尝试实施基本序列化程序,我正在关注“ 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同步的解决方案。
答案 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
,因为它已经为你实现了。您只需要声明queryset
和serializer_class
就像您已经完成的那样:
class UserProfileViewSet(viewsets.ModelViewSet):
queryset = CustomUser.objects.all()
serializer_class = UserProfileSerializer