代码之家  ›  专栏  ›  技术社区  ›  Anuj TBE

DRF ModelSerialize只返回键

  •  0
  • Anuj TBE  · 技术社区  · 6 年前

    我在用 Django 1.5 Django休息框架2

    我已经重写了 create 方法手动添加验证和返回响应。

    我的观点是

    class MultiUserCreateListView(generics.ListCreateAPIView):
        model = MultiUser
        serializer_class = MultiUserSerializer
    
        def get_queryset(self):
            users = MultiUser.objects.get_shared_users(user=self.request.user)
            return users
    
        def create(self, request, *args, **kwargs):
            email = request.DATA.get('email', None)
            access_level = request.DATA.get('access_level', None)
            name = request.DATA.get('name', None)
    
            user = User.objects.filter(email=email)
            if user:
                return  Response({'message': 'Email address already in use.'}, status=status.HTTP_400_BAD_REQUEST)
    
            serializer = self.get_serializer(data=request.DATA)
    
            new_user = create_active_user(request, self, email, email, password=None, is_shared=True)
    
            if new_user:
                if serializer.is_valid():
                    multi_user_obj = MultiUser(
                        user=self.request.user,
                        shared_user=new_user,
                        access_level=access_level
                    )
                    multi_user_obj.save()
    
                    serializer2 = MultiUserSerializer(data=multi_user_obj)
                    return Response(serializer2.data, status=status.HTTP_201_CREATED)
            else:
                return Response({'message': 'Unable to create user. Try again'})
    

    但是响应只包含键,对于在中定义的字段,该键的值为空。 MultiUserSerializer

    {"id": "", "shared_user_name": "", "shared_user_email": "", "access_level": "", "invitation_sent_on": null, "invitation_accepted_on": null, "is_invitation_sent": "", "is_invitation_accepted": "", "created": null, "updated": null}
    

    印刷时 print(multi_user_obj.id) 提供正确的ID。

    为什么它不序列化?

    编辑2:序列化程序

    class MultiUserSerializer(serializers.ModelSerializer):
        shared_user_email = serializers.Field(source='shared_user.email')
        shared_user_name = serializers.Field(source='shared_user.first_name')
        is_invitation_sent = serializers.Field(source='is_invitation_sent')
        is_invitation_accepted = serializers.Field(source='is_invitation_accepted')
    
        class Meta:
            model = MultiUser
            fields = (
                'id', 'shared_user_name', 'shared_user_email',
                'access_level', 'invitation_sent_on', 'invitation_accepted_on',
                'is_invitation_sent', 'is_invitation_accepted',
                'created', 'updated'
            )
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Jrog    6 年前

    你必须通过你的实例 instance 不被 data

    serializer2 = MultiUserSerializer(instance=multi_user_obj)