【发布时间】:2019-05-03 13:14:33
【问题描述】:
我正在尝试概括用户表的更新方法。例如;我希望能够将更新的列作为关键字参数传递。这些是模块的相关部分。
update_user() 通过用户名查找用户并通过更新__dict__ 属性来更新其字段。
class UserModel(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password = db.Column(db.String(80), nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
reputation = db.Column(db.Integer, nullable=False)
registration_date = db.Column(db.DateTime(), nullable=False)
@staticmethod
def update_user(_username, **kwargs):
user = UserModel.query.filter_by(username=_username).first()
print(kwargs)
user.__dict__.update(kwargs)
print(user.__dict__)
db.session.commit()
假设我要更改管理员的密码...
print(UserModel.get_user('admin'))
UserModel.update_user('admin', password='new_password')
print(UserModel.get_user('admin'))
输出看起来像这样......
{'id': 1, 'username': 'admin', 'password': '1234', 'email': 'asd@qwe.com', 'registration_date': datetime.datetime(2018, 12, 1, 19, 58, 35, 216025), 'reputation': 1}
{'password': 'new_password'}
{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x000001FEE907F128>, 'id': 1, 'registration_date': datetime.datetime(2018, 12, 1, 19, 58, 35, 216025), 'email': 'asd@qwe.com', 'username': 'admin', 'reputation': 1, 'password': 'new_password'}
{'id': 1, 'username': 'admin', 'password': '1234', 'email': 'asd@qwe.com', 'registration_date': datetime.datetime(2018, 12, 1, 19, 58, 35, 216025), 'reputation': 1}
当我打印user.__dict__时,显示密码已更新,但未反映到数据库中。这就是为什么当我再次查询记录时,它会显示旧密码。我在这里做错了什么?
【问题讨论】:
-
谢谢,这解决了我的问题,但失去了 dict.update(kwargs) 的优雅:/
标签: python sql flask sqlalchemy flask-sqlalchemy