Класс условного сериализатора в методе запроса - PullRequest
0 голосов
/ 16 апреля 2019

Я создаю один API для создания или обновления.Таким образом, если пользователь auth не существует, он будет создан и, если он существует, проверит наличие обновлений в атрибутах профиля.Поэтому я использовал метод PATCH, где я могу создавать и обновлять.Я хочу создать два сериализатора класса один EmployeeCreate и другой EmployeeUpdate.Поскольку запрос на исправление будет содержать данные запроса, я могу определить, находится ли пользователь там или нет, а затем я хочу выбрать класс сериализатора внутри метода PATCH.Я даже не могу использовать get_serializer_class (), так как я должен определить класс сериализатора перед всеми методами.

В представлениях:

class AddEMPLOYEE(AllCreateErrorPatch, UpdateAPIView):

    queryset = UserProfile.objects.all()
    authentication_classes = [TokenAuthentication, ]
    permission_classes = [IsAdminUser]
    serializer_class = None

    def patch(self, request, *args, **kwargs):
        print(self.get_serializer_class())
        serializer = self.get_serializer(data=request.data)
        if not serializer.is_valid():
            return self.response_error(serializer.errors)

        req_data = serializer.validated_data
        if User.objects.filter(email=request.data['email']).count()==0:
            serializer_class = EmployeeCreate
            user_fields = ["email", "first_name", "last_name", "password"]

            user_data = {field: req_data[field] for field in user_fields}
            for field in user_fields:
                del req_data[field]

            user_serializer = UserSerializer(data=user_data)
            if not user_serializer.is_valid():
                return self.response_error(user_serializer.errors)
            user_serializer.save()

            req_data['user'] = user_serializer.data["id"]
         else:
            serilaizer_class = EmployeeUpdate

        user_profile = UserProfile.objects.get(user=User.objects.get(email=request.data['email']))
        user_profile_serializer = UserProfileSerializer(user_profile, data=req_data, partial=True)
        if not user_profile_serializer.is_valid():
            return self.response_error(user_profile_serializer.errors)

        user_profile_serializer.save()

        resp = user_profile_serializer.data
        # resp.update(user_serializer.data)
        del resp["user"]
        return Response(resp)

В сериализаторе

класс EmployeeCreate (UserProfileSerializer, UserSerializer):

class Meta:
    model = UserProfile
    exclude = ("user", )

класс EmployeeUpdate (UserProfileSerializer, UserSerializer):

class Meta:
    model = UserProfile
    fields = ("mobile",)

Мне нужна техника, с помощью которой мы можем сделать какой-то условный выбор сериализатора внутри методов запроса

1 Ответ

0 голосов
/ 16 апреля 2019

В идеале вы не должны смешивать создание и исправление вместе, но если вам необходимо:

class AddEMPLOYEE(AllCreateErrorPatch, UpdateAPIView):

    queryset = UserProfile.objects.all()
    authentication_classes = [TokenAuthentication, ]
    permission_classes = [IsAdminUser]
    # you do not need to define the serializer class

    def patch(self, request, *args, **kwargs):
        req_data = request.data
        email = req_data.get('email')

        if User.objects.filter(email=email).exists(): # this is faster
            # do whatever on patch
            if EmployeeUpdate(data=req_data).is_valid():
                return # positive response
            return # negative response
         else:
            # do whatever on create
            if EmployeeCreate(data=req_data).is_valid():
                return # positive response
            return # negative response

По сути, хотя это настоятельно рекомендуется , вам не нужно использовать собственный djangoпросмотр пресетов, таких как serializer class.Я бы настоятельно рекомендовал не смешивать логику патча и создавать просто для здравого смысла, но это технически выполнимо.

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