Обновление пользователя с помощью APIVIEW не удается.Пользовательский объект уже существует или создает нового пользователя - PullRequest
0 голосов
/ 16 мая 2018

Я использую django rest Framework и создал представление для обновления пользователя.

Вот мой взгляд:

def put(self, request, *args, **kwargs):
    authorization =UserSuitsPermissions().superuser(request.user)
    userpk = kwargs.get('pk', 0)
    user = get_object_or_404(STUser, pk=userpk)
    if not authorization:
        if request.user['id'] == user.id:
            authorization = True
    if authorization:
        serializeddata = UserSerializer(data=request.data)
        if serializeddata.is_valid(raise_exception=True):
            data = serializeddata.validated_data
            user.__dict__.update(**data)
            user.save()
            serialzed = UserSerializer(user)
            return Response(serialzed.data)
    return Response(status=status.HTTP_401_UNAUTHORIZED)

теперь в этом связанном вопросе они используют универсальное представление и используют сериализатор для обновления пользовательского экземпляра:

Пользователь обновления Django DRF

с принятым ответом:

def update(self, request, *args, **kwargs):
    serializer = self.serializer_class(request.user, data=request.data, partial=True)
    serializer.is_valid(raise_exception=True)
    serializer.save()
    return Response(serializer.data, status=status.HTTP_200_OK)

Я не использую общий вид и, по правде говоря, я над ними. Я не ценю это. поэтому вопрос в том, как мы можем обновить объект пользователя через представление API?

Мой самый большой вопрос: имеет ли эта строка в принятом ответе отношение к моему коду?

serializer = self.serializer_class(request.user, data=request.data, partial=True)

1 Ответ

0 голосов
/ 16 мая 2018

тааак

Я понял это.

правильный способ - передать экземпляр в сериализатор, а затем вызвать save с частичным флагом, установленным в значение true.

код выглядит так:

serializeddata = UserSerializer(user, data=request.data, partial=True)
            if serializeddata.is_valid(raise_exception=True):
                serializeddata.save()
                return Response(serializeddata.data)

с полным видом, похожим на:

def put(self, request, *args, **kwargs):
        authorization =UserSuitsPermissions().superuser(request.user)
        userpk = kwargs.get('pk', 0)
        user = get_object_or_404(STUser, pk=userpk)
        if not authorization:
            if request.user['id'] == user.id:
                authorization = True
        if authorization:
            serializeddata = UserSerializer(user, data=request.data, partial=True)
            if serializeddata.is_valid(raise_exception=True):
                serializeddata.save()
                return Response(serializeddata.data)
        return Response(status=status.HTTP_401_UNAUTHORIZED)

так вот круто

...