Фреймворк Django Rest — результат процесса сериализатора в другом сериализаторе

#django #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
 

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

Ответ №1:

Попробуйте создать экземпляр UserSerializer amp; вызвать метод 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)
 

Комментарии:

1. По какой-то причине print(serializer.instance) не возвращает ничего, есть идеи?