flask 项目 当在写新增或者修改接口时的一些特殊情况
.
.
.
.
.
.
新增或修改时,尽量不要直接对body体里json字典直接用get方法找键对应的值,如果找不到,就判断json字典没有该字段
@blueprint.route('/add', methods=['POST'])
@body_need_keys(['name'])
@token_required
def add():
"""
增加设备 接口
code: 设备编号 name:设备名称 type_id: 设备类型id
新增设备时,node_object表先生成一个对象,然后把生成的对象的id 给 device表的node_object_id字段
"""
device_name = request.json.get('name')
device_code = request.json.get('code') # 可以不传,但是要传,就要保证编号唯一
manage_biz_person_id = request.json.get('manage_biz_person_id')
node_location_id = request.json.get('node_location_id') # 可以不传
if not device_name:
return jsonify_return_body(['result', 'code', 'msg'], result=False, msg='参数错误')
try:
if device_code:
device_obj = db.session.query(Device).filter(Device.code == device_code).first()
if device_obj:
return jsonify_return_body(['result', 'code', 'msg'], result=False,
msg='该设备编号已存在,请更换要添加的设备编号')
# 先生成node_object_obj (node_location_id 不传就设为空)
node_object_obj = NodeObject(name=device_name, type_id=1, node_location_id=node_location_id)
db.session.add(node_object_obj)
db.session.flush()
# 生成device设备对象 ( code与manage_biz_person_id 不传就设为空 )
device_obj = Device(name=device_name, code=device_code, type_id=8,
manage_biz_person_id=manage_biz_person_id, node_object_id=node_object_obj.id)
db.session.add(device_obj)
db.session.flush()
# 生成device_cam设备对象
device_cam_obj = DeviceChargingPile(device_id=device_obj.id)
device_cam_obj_accept_keys = ['price', 'voltage', 'current', 'power']
for key in device_cam_obj_accept_keys:
if key in request.json.keys():
device_cam_obj.__setattr__(key, request.json.get(key))
# 如果这里这样给字段添加值,直接判断request.json.get('price') 是不是None,
# 不是None,就直接 device_cam_obj.price = request.json.get('price'),是None就认为前端没传值过来
# 就不设置,这样可以吗? 不行,就特殊情况
# 如果前端传来的'price'字段就是None,就是想让该字段设置成None,这个时候,用get方法得到的是None
# 我们就会认为前端没有price字段,没想给该字段添加值,后端不做处理
# 那么最后对象生成的时候,数据库里该字段如果有设置默认值,
# 那么该字段的值就是默认值了,但是显然我们想要的是该字段就是要设置成None
# 所以才这样写的
db.session.add(device_cam_obj)
db.session.commit()
return jsonify_return_body(['result', 'code', 'msg'], result=True, msg='设备添加成功')
except Exception as ex:
# db.session.rollback()
print(str(ex))
db.session.rollback()
return jsonify_return_body(['result', 'code', 'msg'], result=False, msg='设备添加时,发生错误')
-----------------------------------------
-----------------------------------------
device_cam_obj_accept_keys = ['price', 'voltage', 'current', 'power']
for key in device_cam_obj_accept_keys:
if key in request.json.keys():
device_cam_obj.__setattr__(key, request.json.get(key))
# 这几行代码实际上也可以用这样的代码来代替,也就是你前端只要传了,我都给你将对应字段设置上你传的参数
price = request.json.get('price', None)
voltage = request.json.get('voltage', None)
current = request.json.get('current', None)
power = request.json.get('power', None)
if 'price' in request.json.keys():
device_cam_obj.price = price
if 'voltage' in request.json.keys():
device_cam_obj.voltage = voltage
if 'current' in request.json.keys():
device_cam_obj.current = current
if 'power' in request.json.keys():
device_cam_obj.power = power
----------------------------------------------------------
.
.
.
.
.
.
.
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY