在django rest框架的一个序列化器中创建两个模型

时间:2017-06-05 10:10:07

标签: django-rest-framework

在注册用户期间,我希望在一次api调用中同时创建User对象和EmailContact对象。不应链接这两个对象。 我有以下序列化器:

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()之后):

/ api / register 中的AttributeError 尝试在序列化程序userserializer上获取字段RegistrationSerializer的值时出现AttributeError。 序列化程序字段可能名称不正确,并且与User实例上的任何属性或键都不匹配。 原始异常文本是:'User'对象没有属性'userserializer'。

1 个答案:

答案 0 :(得分:1)

RegistrationSerializer.create()方法中,您将返回User个对象。序列化程序将尝试将该对象序列化为此表示形式:

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

但它抱怨,因为您返回的用户没有userserializer字段。

如果你真的想从这个API调用中返回一个用户,你可以使用Meta.model = User将RegistrationSerializer作为ModelSerializer,并覆盖perform_create以弹出emailcontact_data。 (我将字段命名为RegistrationSerializer.email_contact以使表示更清晰,IMO短语"序列化程序"不应出现在API的客户端可见部分上)

或者,如果要渲染两个子序列化程序,可以通过传入数据在RegistrationSerializer.create中创建RegistrationSerializer实例,例如

return RegistrationSerializer(data={'emailcontactserializer': 
    emailcontact_data, 'userserializer': user_data})