Не могу понять ввод и результат в Serializer - PullRequest
0 голосов
/ 09 января 2019

Насколько я знаю, роль сериализатора заключается в переводе некоторых специальных объектов в Python-нативный объект или наоборот.

В следующем коде входные данные (из request.data) изначально являются данными не-python, так как http-запрос выполняется в формате JSON. И после этого мы получаем данные Python на втором этапе (вы можете увидеть в комментарии). Но странная часть заключается в том, что вы снова десериализуете, что делает данные обратно в формат данных, не являющийся собственным Python. Я думаю, что это полностью излишне.

Может кто-нибудь объяснить, почему мы делаем такие вещи?

class LoginAPIView(APIView):
    permission_classes = (AllowAny, )
    renderer_classes = (UserJSONRenderer,)
    serializer_class = LoginSerializer

    # 1st step 
    # 'request.data' would be JSON format, 
    # since JS or other front-end sends data in JSON format
    def post(self, request):

        #2nd step
        #Here, we can get a native python data - dictionary
        user = request.data.get('user',{}) #Here

        #3rd step          
        #putting keyword arguments in serializer 
        #would return the de-serialized object,
        #that is, a non-native python object.
        serializer = self.serializer_class(data=user) 

        serializer.is_valid(raise_exception=True)

        return Response(serializer.data, status=status.HTTP_200_OK)

1 Ответ

0 голосов
/ 09 января 2019

Первый шаг преобразует объект JSON в словарь, но кроме этого он не выполняет никаких других преобразований. Все, что там должно представлять даты, числа с плавающей точкой и т. Д., Будет представлено в виде строки. Вот где приходит сериализатор, в этом случае десериализация. На третьем этапе применяется проверка, чтобы убедиться, что полученная информация верна. Если бы это был обычный пост с созданием нового объекта, то он был бы сохранен в базе данных, но в этом случае целью является просто проверка. Наконец, объект возвращается в JSON для ответа. В этом особом случае это окончательное «преобразование» не понадобится, поскольку в модели ничего не изменилось, но обратите внимание, что в действительности ничего не происходит, потому что serializer.data просто хранит данные, которые были введены в конструктор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...