IntegrityError в /api/users/profile/update

Я пытаюсь реализовать функциональность обновления пользователя, но всякий раз, когда я пытаюсь обновить пользователя, я получаю ошибку IntegrityError, говорящую: UNIQUE constraint failed: auth_user.username

Вот что у меня есть на данный момент:

Вот мои сериализаторы для пользователя:

class UserSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField(read_only=True)
    _id = serializers.SerializerMethodField(read_only=True)
    isAdmin = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = User
        fields = ['id', '_id', 'username', 'email', 'name', 'isAdmin']

    def get__id(self, obj):
        return obj.id

    def get_isAdmin(self, obj):
        return obj.is_staff

    def get_name(self, obj):
        name = obj.first_name
        if name == '':
            name = obj.email
        return name


class UserSerializerWithToken(UserSerializer):
    token = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = User
        fields = ['id', '_id', 'username', 'email', 'name', 'isAdmin', 'token']

    def get_token(self, obj):
        token = RefreshToken.for_user(obj)
        return str(token.access_token)

Вот мой метод просмотра:

@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def updateUserProfile(request):
    user = request.user
    serializer = UserSerializerWithToken(user, many=False)
    data = request.data
    user.first_name = data['name']
    user.username = data['email']
    user.email = data['email']

    if data['password'] != '':
        user.password = make_password(data['password'])

    user.save()

    return Response(serializer.data)


А это мое действие пользователя:

export const updateUserProfile = (user) => async (dispatch, getState) => {
  try {
    dispatch({
      type: USER_UPDATE_PROFILE_REQUEST,
    });

    const {
      userLogin: { userInfo },
    } = getState();
    const config = {
      headers: {
        "Content-type": "application/json",
        Authorization: `Bearer ${userInfo.access}`,
      },
    };
    const { data } = await axios.put(`/api/users/profile/update`, user, config);
    dispatch({
      type: USER_UPDATE_PROFILE_SUCCESS,
      payload: data,
    });
    dispatch({
      type: USER_LOGIN_SUCCESS,
      payload: data,
    });
    localStorage.setItem("userInfo", JSON.stringify(data));
  } catch (error) {
    dispatch({
      type: USER_UPDATE_PROFILE_FAIL,
      payload:
        error.response && error.response.data.detail
          ? error.response.data.detail
          : error.message,
    });
  }
};

При проверке Google Chrome говорится, что ошибка возникает в строке 142 (в const {data} в функции updateUserProfile). Я читал, что эта ошибка может произойти, когда вы пытаетесь создать нового пользователя с теми же учетными данными (имя пользователя или email), но в моем случае я посылаю запрос put и не могу понять, почему я получаю эту ошибку.

Почему вы не можете добавить функцию full_clean для проверки перед сохранением,

def save(self, *args, **kwargs):
        self.full_clean()
        return super(UserModel, self).save(*args, **kwargs)

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


@receiver(pre_save)
def pre_save_handler(sender, instance, *args, **kwargs):
    instance.full_clean()

Вернуться на верх