我有一个User
模型,还有一些密码列(PasswordType
),以及许多其他列。当我尝试这样做时
user = # get some user with some query
print(user.password)
# there is a password
user.password = 'something else'
db.session.is_modified(user)
# True
db.session.commit()
print(user.password)
# prints new password
user.password = None
db.session.is_modified(user)
# True
db.session.commit()
print(user.password)
# This correctly prints None
# Now the funny part,
user.password = 'something new again'
db.session.is_modified(user)
# False
db.session.commit()
print(user.password)
# Prints None again.
我已经在这里工作了几个小时,无法弄清楚为什么会发生这种情况。
答案 0 :(得分:1)
问题在于PasswordType
中的SQLAlchemy-utils
。
当我拨打force_auto_coercion
时,它可以正常工作。
答案 1 :(得分:0)
这可能会回答您的问题:请查看:http://docs.sqlalchemy.org/en/rel_0_9/orm/session_api.html#sqlalchemy.orm.session.Session.is_modified
使用此方法测试时,Session.dirty集合中的实例可能会报告False。这是因为对象可能已经通过属性变异接收到更改事件,因此将其放在Session.dirty中,但最终状态与从数据库加载的状态相同,导致此处没有净更改。
您可能还希望将此用作状态管理实用程序(以了解您的实例所处的状态)。
>>> from sqlalchemy.orm.util import object_state
>>> print object_state(instance)