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

----------------------------------------------------------

.
.
.
.
.
.
.
.

posted @   tengyifan  阅读(31)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示