2017-06-05 106 views
0

在用戶註冊期間,我希望同時在一個API調用中創建User對象和EmailContact對象。這兩個對象不應該鏈接。 我有以下串行:在Django rest框架的一個序列化程序中創建兩個模型

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實例上的任何屬性或密鑰。 原始異常文本爲:'用戶'對象沒有屬性'userserializer'。

回答

1

在您的RegistrationSerializer.create()方法中,您將返回User對象。串行器將嘗試序列化對象插入此表示:

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

但它的抱怨,因爲您返回的用戶不具有userserializer場。

如果你真的想從這個API調用中返回一個用戶,你可以讓你的RegistrationSerializer成爲一個帶有Meta.model = User的ModelSerializer,並且覆蓋perform_create來彈出emailcontact_data。 (我會將該字段命名爲RegistrationSerializer.email_contact以使表示更清晰,IMO API中的客戶端可見部分不應出現「序列化程序」一詞)。

另外,如果你想使你的兩個子序列化的,您可以在RegistrationSerializer.create通過傳遞數據創建一個RegistrationSerializer例如,像

return RegistrationSerializer(data={'emailcontactserializer': 
    emailcontact_data, 'userserializer': user_data}) 
相關問題