2016-04-23 14 views
0

ベースシリアライザを実装しようとしていて、「http://www.django-rest-framework.org/api-guide/serializers/#baseserializer」に従っています。DJangoでベースシリアライザを実装するのに手助けが必要

マイ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ガイドと同期している解決策を探しています。

答えて

1

をdashboard_dataを渡してみてください

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

、このために以下の輸入が必要になりますシリアライザ:

それあなたが必要と思われるものは、ModelSerializer

ModelSerializerクラスは、モデルフィールドに対応するfieldsSerializerクラスを自動的に作成するためのショートカットを提供します。

class UserProfileSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = CustomerUser 
     fields = '__all__' 

私は、モデル内のすべてのフィールドがシリアライズされていることを示すために__all__fields属性を設定しています。しかし、あなたはまた、exaclty含めるフィールドを指定することができます

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

ビューセット:

第二の点は、あなたが本当にそれはすでにあるのでgetメソッドを実装する必要はありませんModelViewSetについてですあなたのために実装されます。

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

を、私は同意し、私はこの作品と確信して:あなたはちょうどあなたがすでに行っているだけのようquerysetserializer_classを宣言する必要があります。しかし、私は単に学ぶためにBaseシリアライザを使用しようとします。 –

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) 

あなたはこれが動作しない場合は、単にJSONResponse関数に

関連する問題