我正在使用Flask-SQLAlchemy。我有一个包含几个属性的表。我有一个字典key='attribute-name'
和value=the_new_value
。
我想使用字典更新现有的行/条目。有没有办法使用**kwargs
更新条目,而不是手动一次更新它们?
我在SQLAlchemy中找到了两个set_attribute
方法的引用:here和here,但是它们都解决了比我要求的更具体的问题。
我尝试了set_attribute
,但它对我不起作用。我没有收到任何错误消息,但数据库属性不会更改。我在想:
1)在Flask-SQLAlchemy中访问/导入set_attribute
的正确方法是什么?
2)可以将密钥存储为set_attribute
中的** kwargs的字符串吗?
3)如果1)或2)都不是我的问题,那是什么?
至于代码,这是它的样子,首先是模型:
class Files(UserMixin, db.Model):
id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
filename_main = db.Column(db.String(264))
filename_side1 = db.Column(db.String(264))
filename_side2 = db.Column(db.String(264))
def update(self, **kwargs):
for key, value in kwargs.items():
set_attribute(self, key, value)
在视图中,我想做这样的事情:
files = Files.query.filter_by(id=id).first()
filenames = {'filename_main': 'main.ext',
'filename_side1': 'side1.ext',
'filename_side2': 'side2.ext'}
files.update(**filenames)
答案 0 :(得分:1)
我会用这种方式实现更新方法:
@staticmethod
def update(new_data, id):
# note that this method is static and
# you have to pass id of the object you want to update
keys = new_data.keys() # new_data in your case is filenames
files = Files.query.filter_by(id=id).first() # files is the record
# you want to update
for key in keys:
exec("files.{0} = new_data['{0}']".format(key))
db.session.commit()
这解决了你的问题。
答案 1 :(得分:1)
尝试一下
management.endpoints.web.exposure.include=*