Django Rest Framework - обработка результата сериализатора в другом сериализаторе

У меня есть следующие два представления в моем django api views.py:

@api_view(['GET',])
@authentication_classes([JSONWebTokenAuthentication])
@permission_classes([AllowAny])
def user(request):
    if request.method == 'GET':
        serializer = UserSerializer(request.user)
        return JsonResponse(serializer.data, safe=False)


@api_view(['POST'])
@permission_classes([AllowAny])
def user_create(request):
    exception_handler = UserUnavailable
    success_handler = UserCreated
    if request.method == 'POST':
        serializer = CreateUserSerializer(data=request.data)
        try:
            if serializer.is_valid(raise_exception=True):
                serializer.save()
                return JsonResponse({"status_code": success_handler.status_code,
                                     "default_detail": success_handler.default_detail,
                                     "default_code": success_handler.default_code,
                                     "user_object": UserSerializer(serializer.instance)
                                     }, safe=False)
        except APIException:
            return JsonResponse({"status_code": exception_handler.status_code,
                                 "default_detail": exception_handler.default_detail,
                                 "default_code": exception_handler.default_code
                                 }, safe=False)

serializers.py

class UserSerializer(serializers.ModelSerializer):
    id = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())

    class Meta:
        model = get_user_model()
        fields = ('id', 'user', 'avatar_url', 'avatar_tn_url')
        read_only_fields = ('id', 'user')


class CreateUserSerializer(serializers.ModelSerializer):

    class Meta:
        model = get_user_model()
        fields = ('user', 'password')
        extra_kwargs = {'password': {'write_only': True}}   # We dont want to show the hashed password

    def create(self, data):
        password = data.pop('password')
        user = User.objects.create_user(
                data['user'],
        )
        user.set_password(password)
        user.save()
        return user

Я хочу сделать так, чтобы после создания пользователя, я хотел бы показать объект пользователя в ответе API, поэтому у меня есть UserSerializer(serializer.instance), но кажется, что это утверждение просто неверно. Может кто-нибудь помочь?

Попробуйте создать экземпляр UserSerializer & вызовите метод is_valid(). Вы можете вызвать свойство .data для сериализации экземпляра User.

Взгляните на обновленный код:

@api_view(['POST'])
@permission_classes([AllowAny])
def user_create(request):
    exception_handler = UserUnavailable
    success_handler = UserCreated
    if request.method == 'POST':
        serializer = CreateUserSerializer(data=request.data)
        user_serializer = UserSerializer(serializer.instance)

        try:
            if serializer.is_valid(raise_exception=True) and user_serializer.is_valid(raise_exception=True):
                serializer.save()
                return JsonResponse({"status_code": success_handler.status_code,
                                     "default_detail": success_handler.default_detail,
                                     "default_code": success_handler.default_code,
                                     "user_object": user_serializer.data
                                     }, safe=False)
        except APIException:
            return JsonResponse({"status_code": exception_handler.status_code,
                                 "default_detail": exception_handler.default_detail,
                                 "default_code": exception_handler.default_code
                                 }, safe=False)
Вернуться на верх