我试图概括用户表的更新方法。例如; 我希望能够将更新的列作为关键字参数传递。这些是模块的相关部分。
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': '[email protected]', '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': '[email protected]', 'username': 'admin', 'reputation': 1, 'password': 'new_password'}
{'id': 1, 'username': 'admin', 'password': '1234', 'email': '[email protected]', 'registration_date': datetime.datetime(2018, 12, 1, 19, 58, 35, 216025), 'reputation': 1}
当我打印时user.__dict__
,它显示密码已更新,但未反映到数据库中。这就是为什么当我再次查询记录时,它显示的是旧密码。我在这里做错了什么?
SQLAlchemy 提交对通过 __dict__ 修改的对象的更改表明 using__dict__
不是进行更新的好方法。
您可以dict.update
通过迭代来模拟kwargs
。
@staticmethod
def update_user(_username, **kwargs):
user = UserModel.query.filter_by(username=_username).first()
print(kwargs)
for key, value in kwargs.items(): # `kwargs.iteritems()` in Python 2
setattr(user, key, value)
print(user.__dict__)
db.session.commit()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句