我认为问题在于将更改提交到数据库(第3行到最后一行:db.session.commit()
)。例如,请用户: username =“Foo”,email =“Bar@yahoo.com”。如果在PUT请求正文中我放了{“email”:“changed@gmail.com”},则在分配后打印“user.email”会显示该值实际上已更改。然而,在查询数据库之后,电子邮件保持不变。无论如何,我真的很难弄清楚我错过了什么,所以任何帮助都表示赞赏!
class UserAPI(Resource):
def __init__(self):
self.parser = reqparse.RequestParser()
self.parser.add_argument('username', type=str, location='json')
self.parser.add_argument('email', type=str, location='json')
self.parser.add_argument('password', type=str, location='json')
super(UserAPI, self).__init__()
def put(self, id):
# Not working
user = User.query.filter_by(id=id).first()
if user is not None:
args = self.parser.parse_args()
for key, value in args.items():
if args[key] is not None:
user.key = value
db.session.commit()
return {"user": marshal(user,user_field) }
return {"error": "User not found"}, 404
答案 0 :(得分:4)
将git status
更改为user.key = value
。
您没有在此设置所需的属性(setattr(user, key, value)
),而是设置user.email
。因为user.key
可能不是数据库列字段(当然不是您要设置的字段),所以在调用user.key
时,更改不会序列化到数据库。
答案 1 :(得分:0)
user.key 将不起作用,因为在循环args时,我们会得到键和值的字符串表示形式。 如果我们执行class_instance_name.key,它将不会指向属性名称,因为key不是属性名称,它只是一个字符串。
ex-这里的user.key类似于user.'username',因此它不起作用。
改为使用setattr(user, key, value)