![](/img/trans.png)
[英]What's the difference between setattr() and object.__setattr__()?
[英]What is the difference between `vars` and `setattr`?
在使用 vars 更改 db.Model(flask-sqlalchemy) 值失敗后,我改用
setattr
解決了這個問題,但在閱讀文檔后仍然沒有得到vars
和setattr
之間的區別。
這是我嘗試過的
vars
失敗from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def set_option_parameters(var, option_keys, options):
for option_key in options:
if option_key in option_keys and options[option_key] is not None:
vars(var)[option_key] = options[option_key]
# setattr(var, option_key, options[option_key])
class Application(db.Model):
id = db.Column(db.BigInteger(), primary_key=True, autoincrement=True)
name = db.Column(db.VARCHAR(20), nullable=False)
...
def __init__(self, options):
option_keys = set(["name"])
set_option_parameters(self, option_keys, options)
def modification(self, options):
modifiable = set(["name"])
set_option_parameters(self, modifiable, options)
vars(var)[option_key] = options[option_key]
在初始化Application
對象時工作正常,但modification
失敗( name
沒有改變)。
我試圖在db.session.commit()
之前打印application.__dict__
,它確實被修改了!
application = Application.query.filter_by(id=args["id"]).first()
# args["name"] is not None
app.logger.info(f"Before: {application.__dict__}")
application.modification(args)
app.logger.info(f"After: {application.__dict__}")
db.session.commit()
輸出
[2019-02-27 11:22:59,209] INFO in equipmentbaseapplicationhandler: Before:{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7f718ac2b588>, 'id': 9, 'name': 'old_name'}
[2019-02-27 11:22:59,209] INFO in equipmentbaseapplicationhandler: After:{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7f718ac2b588>, 'id': 9, 'name': 'new_name'}
但是當我檢查 mysql 時,它不起作用
setattr
成功然后我在函數set_option_parameters
更改為setattr(var, option_key, options[option_key])
。
init 和application.__dict__
都很好用, application.__dict__
的輸出是一樣的!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.