Я создаю один 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",)
Мне нужна техника, с помощью которой мы можем сделать какой-то условный выбор сериализатора внутри методов запроса