从request.json批量更新SQLAlchemy表[编辑]

时间:2019-08-31 12:22:21

标签: json flask sqlalchemy

我正在使用Flask和SQLAlchemy(带有Flask-SQLAlchemy扩展名)。

我有一个TargetListType模型,该模型存储目标列表类型记录的有序列表(使用“序列”列来定义顺序)。

我有一个Flask网页,其中显示了这些目标列表类型,并使用户可以对其进行重新排序。这些对订单的更改将使用AJAX发布回Flask应用程序,其中View函数通过SQLAlchemy以更改的顺序更新数据库。

当前,该View函数遍历JSON并分别更新每个数据库记录。我认为必须有更好的方法。本质上,我需要的是一个相关的更新,将JSON与数据库记录相关联。

我知道如何使用2个SQLAlchemy表进行相关更新。我不知道如何使用JSON对象和SQLAlchemy表来做到这一点。

这是我的(简化的)模型定义(models.py):

from .. import db

class TargetListType(db.Model):
    __tablename__ = 'targetlisttypes'
    id = db.Column(db.Integer, primary_key=True)
    sequence = db.Column(db.Integer)
    name = db.Column(db.String(64))
    description = db.Column(db.String(1024))

这是request.json的样子(请注意,它仅包含必填字段,而不是所有模型列)。 “ dbid”对应于模型“ id”,“ seq”对应于模型“ sequence”:

[
    {"dbid": 2, "seq": 1},
    {"dbid": 1, "seq": 2},
    {"dbid": 3, "seq": 3}
]

这是我当前的视图功能(views.py):

from flask import jsonify, request
from .. import db
from .models import TargetListType

@targets.route('/targetlisttypes_post', methods=['GET', 'POST'])
@login_required
def targetlisttypes_post():
    # End point for AJAX update to TargetListType sequencing
    try:
        data = request.json
        for item in data:
            target_list_type = TargetListType.query.get(item['dbid'])
            if target_list_type is None:
                raise KeyError(f"Id {item['dbid']} not found")
            target_list_type.sequence = item['seq']
            db.session.add(target_list_type)
        db.session.commit()
    except KeyError as e:
        # If any individual record not found then all updates are rolled back
        db.session.rollback()
        return jsonify(f"Target List Type not in DB, please refresh page [{e}]")
    except Exception as e:
        db.session.rollback()
        return jsonify(f"Unable to save changes, please refresh page [{e}]")
    return jsonify("Target List Types sequence updated")

所以我的问题是:我可以对TargetListType.id == request.json ['dbid']的所有TargetListType记录的序列列进行批量“相关”更新,还是我当前的迭代解决方案是最佳选择?

0 个答案:

没有答案