我有一个这样的表:
class Mapping(db.Model):
map_id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer)
bike_id = db.Column(db.String(255))
is_active_data = db.Column(db.Boolean, default=True)
created_by = db.Column(db.String(150))
updated_by = db.Column(db.String(150))
我的 POST 方法:
def save_MapperM(adddata):
create_data = Mapping(**adddata)
db.session.add(create_data)
db.session.commit()
return dict(Successful="Successfully Created")
路线:
@test.route("/addmapper"))
class MapperV(Resource):
@staticmethod
def post():
if request.method == 'POST':
save_data = request.get_json()
try:
return jsonify(save_MapperM(save_data))
except Exception:
return jsonify({'Unsuccessful': 'Looks like you missed something !!'})
当前代码:
要求:
来自UI的示例数据格式:
{ user_id: 1, bike_id: 1,2,3,4 }
答案 0 :(得分:0)
最简单的解决方案是使用循环修改save_MapperM
函数:
def save_MapperM(adddata):
for bike_id in adddata["bike_id"]:
item_data = adddata.copy()
item_data["bike_id"] = bike_id
create_data = Mapping(**item_data)
db.session.add(create_data)
db.session.commit()
return dict(Successful="Successfully Created")
但是请谨慎使用此函数,因为它允许使用从POST请求接收到的任何参数来创建Mapping
实例。看起来是有意的,但是如果您的Mapping
类具有一些私有属性,这些私有属性只能在服务器端填充,则可能会导致安全问题。例如,用户“ Mike”可以发送请求:
{ "user_id": 1, "bike_id": [1, 2], "created_by": "Alex", "updated_by": "Alex" }
这将导致save_MapperM
函数创建实例并将created_by
和updated_by
的值设置为“ Alex”(可能不正确)。最好从session data获取此类属性。
因此您的post方法可能看起来像这样(post
和save_MapperM
功能组合):
def post():
request_data = request.get_json()
for bike_id in request_data.get("bike_id", []):
item = Mapping(
user_id=request_data.get("user_id"),
bike_id=bike_id,
created_by=session.get("username"),
updated_by=session.get("username"),
)
db.session.add(item)
try:
db.session.commit()
except Exception:
return jsonify({"success": False})
return jsonify({"success": True})
下一步可能是实现请求JSON数据验证。如果您有几个具有简单结构的JSON密钥,那么可以,但是当您需要传递大量数据时,需要确保它是正确的。例如,您可以为此Marshmallow使用一些序列化/ ODM库。