使用kwargs Flask-SQLAlchemy更新表属性

时间:2017-12-24 15:07:56

标签: flask flask-sqlalchemy kwargs

我正在使用Flask-SQLAlchemy。我有一个包含几个属性的表。我有一个字典key='attribute-name'value=the_new_value

我想使用字典更新现有的行/条目。有没有办法使用**kwargs更新条目,而不是手动一次更新它们?

我在SQLAlchemy中找到了两个set_attribute方法的引用:herehere,但是它们都解决了比我要求的更具体的问题。

我尝试了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)

2 个答案:

答案 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=*