Структура отдыха Django добавляет дополнительный контекст в ответ - PullRequest
0 голосов
/ 09 ноября 2018

Я использую updateapiview для обновления информации о пользователе. Это мой взгляд

class UserUpdateView(generics.UpdateAPIView):
   serializer_class = UserUpdateSerializer

  def get_queryset(self):
    print(self.kwargs['pk'])
    return User.objects.filter(pk=self.kwargs['pk'])

  def partial_update(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.data, partial=True)
    if self.get_object() != request.user:
        return Response({'error': 'permission denied'}, status=status.HTTP_400_BAD_REQUEST)
    print(request.data['password'])
    request.data['password'] = make_password(request.data['password'])
    instance = super(UserUpdateView, self).partial_update(request, *args, **kwargs)
    return instance

Это мой сериализатор

class UserUpdateSerializer(serializers.ModelSerializer):

  email = serializers.EmailField(required=True)

  def validate_username(self, username):
    if User.objects.filter(username=username):
        raise serializers.ValidationError('Username already exists!!')
    return username

  def validate_email(self, email):
    if User.objects.filter(email=email):
        raise serializers.ValidationError('Email already exists!!')
    return email

  class Meta:
    model = User
    fields = ('pk', 'username', 'password', 'email')
    read_only_fields = ('pk',)

Я получаю данные обновлены и возвращены успешно. Но я хочу добавить какое-то поле, например, сообщение с содержимым, «успешно обновленным» при успешном обновлении профиля пользователя. Я искал, есть ли способ сделать это, но не могу найти подходящий способ сделать это (как метод get_context_data в django). Итак, есть ли способ выполнить вышеуказанную задачу?

Вопрос 2: Как предотвратить самостоятельного пользователя (например, если у него есть электронная почта sample@gmail.com, и если пользователь нажимает кнопку udpate с тем же адресом электронной почты, это не должно вызывать ошибку, что имя пользователя уже существует, я думаю, это можно сделать с помощью self.instance (но не уверен, как на самом деле это реализовать).

Спасибо!

1 Ответ

0 голосов
/ 09 ноября 2018

Я не уверен, какую версию DRF вы используете, но в последней версии 3.9.0 UpdateAPIView используется UpdateModelMixin, который возвращает объект ответа вместо экземпляра. Таким образом, вы можете изменить данные перед возвратом.

def partial_update(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.data, partial=True)
    if self.get_object() != request.user:
        return Response({'error': 'permission denied'}, status=status.HTTP_400_BAD_REQUEST)
    print(request.data['password'])
    request.data['password'] = make_password(request.data['password'])
    response = super(UserUpdateView, self).partial_update(request, *args, **kwargs)
    response.data['message'] = 'Successfully updated'
    return response

Относительно вашего второго вопроса вы можете исключить текущего пользователя, используя self.instance.

def validate_email(self, email):
    if User.objects.filter(email=email).exclude(id=self.instance.id).exists():
        raise serializers.ValidationError('Email already exists!!')
    return email
...