我正在使用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记录的序列列进行批量“相关”更新,还是我当前的迭代解决方案是最佳选择?