2017-06-05 16 views
0

ユーザーの登録時に、1つのAPI呼び出しでUserオブジェクトとEmailContactオブジェクトの両方を作成したいと考えています。 2つのオブジェクトはリンクしないでください。 私は、次のシリアライザを持っている:django rest frameworkのシリアライザで2つのモデルを作成する

class RegistrationSerializer(serializers.Serializer): 
    userserializer=UserAccountSerializer() #reuse existing modelserializer 
    emailcontactserializer=EmailContactSerializer() #reuse existing modelserializer 

    def create(self, validated_data): 
     emailcontact_data = validated_data.pop('emailcontactserializer') 
     user_data = validated_data.pop('userserializer') 
     emailcontact= EmailContact.objects.create(**emailcontact_data) 
     user= User.objects.create(**user_data) 
     return user 

と、次のApiview:

class RegistrationAPIView(APIView): 
    permission_classes = (AllowAny,) 
    serializer_class = RegistrationSerializer 

    def post(self, request): 
     serializer = self.serializer_class(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

私が得るエラーは以下の通りです((serializer.saveした後に発生)):

はAttributeError at/api/register シリアライザRegistrationSerializerのフィールドuserserializerの値を取得しようとしたときにAttributeErrorが発生しました。 シリアライザフィールドの名前が正しくない可能性があり、Userインスタンスの属性またはキーと一致しない可能性があります。 元の例外テキストは 'User'オブジェクトには 'usererializer'属性がありませんでした。

答えて

1

RegistrationSerializer.create()メソッドでは、Userオブジェクトを返します。シリアライザはこの表現に、そのオブジェクトをシリアル化しようとします:

{ 
    'userserializer': x, 
    'emailcontactserializer': y 
} 

しかし、あなたが返され、ユーザーがuserserializerフィールドを持っていないので、それは文句を言っています。

本当にこのAPI呼び出しからユーザーを返すようにしたい場合は、Meta.model =ユーザーにあなたのRegistrationSerializer ModelSerializerを行い、emailcontact_dataを飛び出すするperform_createをオーバーライドすることができます。 (私は、表現をより明確にするためにRegistrationSerializer.email_contactのようなフィールドに名前をつけていますが、IMOというフレーズ「シリアライザ」はAPIのクライアント部分には存在してはいけません)。

あなたのサブシリアライザの両方をレンダリングしたい場合はまた、あなたがデータを渡してRegistrationSerializer.createにRegistrationSerializerインスタンスを作成することができ、

return RegistrationSerializer(data={'emailcontactserializer': 
    emailcontact_data, 'userserializer': user_data}) 
のようなもの
関連する問題