Django DRF使用serializer输出多接口项仅返回最后一项如何解决
问题根因
该问题由data变量的构造逻辑错误导致:
原代码遍历interfaces列表时,每次循环都直接重新赋值data = [{"interface": i}],新值会完全覆盖上一轮循环的内容,最终data仅保留了列表最后一个接口的字典结构,因此序列化后只会返回最后一项。
修复方法
调整data的构造逻辑,先初始化空列表,再将每个接口的字典结构追加到列表中即可,修改后的完整代码如下:
@api_view(['GET']) def selected_device(request,pk=None): if pk != None: devices = Device.objects.filter(pk=pk) devicedetail = DeviceDetail.objects.filter(DD2DKEY=pk) cursor = connection.cursor() tablename= "dev_interface_" + str(pk) cursor.execute(f"SELECT interface FROM {tablename} ") righttable = cursor.fetchall() devserializer = DeviceSerializers(devices, many=True) devdserializer = DeviceDetailSerializers(devicedetail, many=True) interfaces = [] for i in righttable: interfaces.append(i[0]) # 调整部分:先初始化空列表,再循环追加数据 data = [] for i in interfaces: data.append({"interface": i}) interserializer = InterfaceSerializers(data, many = True) results = { "device":devserializer.data, "device_details" : devdserializer.data, "interface":interserializer.data, } return Response(results)
额外优化建议
当前代码直接拼接字符串生成表名、执行SQL的写法存在SQL注入风险,如果pk参数是用户可控制的输入,建议增加表名校验逻辑,或者改用Django ORM的安全查询方式,避免恶意注入攻击。
内容的提问来源于stack exchange,提问作者L.Calvin
相关产品推荐
相关产品推荐

