【问题标题】:creating two models in one serializer of django rest framework在 django rest 框架的一个序列化器中创建两个模型
【发布时间】:2017-11-06 02:04:34
【问题描述】:

在用户注册期间,我希望在一次 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 尝试在序列化程序 RegistrationSerializer 上获取字段 userserializer 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 User 实例上的任何属性或键都不匹配。 原始异常文本是:“用户”对象没有属性“用户序列化器”。

【问题讨论】:

    标签: django-rest-framework


    【解决方案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})
    

    【讨论】:

    • 我遇到了同样的问题并尝试了你的方法,但我仍然得到同样的错误。
    猜你喜欢
    • 2020-10-26
    • 2018-03-10
    • 2016-04-07
    • 2012-11-16
    • 2017-06-25
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 2014-07-26
    相关资源
    最近更新 更多