使用Django REST Framework取字段时报list索引需为整数错误如何解决
错误原因
你初始化序列化器时指定了many=True,匹配你传入的外层为数组的JSON结构,此时serializer.data返回的是列表类型,无法直接用字符串作为索引取值,这是报错的直接原因。
另外还有两个易忽略的错误点:
- 使用DRF序列化器必须先调用
is_valid()完成数据校验,才能读取data属性,否则会触发逻辑异常。 - 你提交的JSON中同一个对象包含两个重复的
email键,不符合JSON规范,后端实际接收时前一个email值会被后一个覆盖,只会保留admin22@admin.com。
解决方案
方案1:保留外层数组结构
如果业务逻辑确实需要外层传数组,且每次数组内只有一个会议对象,修改代码如下:
serializer = EmailsListSerializer(data=request.data, many=True) # 开启校验不通过自动抛出异常 serializer.is_valid(raise_exception=True) # 取列表第一个元素的对应字段 meeting_date = serializer.data[0]['meeting_date'] meeting_timezone = serializer.data[0]['time_zone']
方案2:去掉外层数组结构
如果业务不需要传递多个对象,可调整前端传参格式,去掉外层[]直接传入JSON对象,同时修改序列化器初始化参数:
# 此时前端传参结构为:{"email": "xxx", "meeting_date":"2021-06-29", "time_zone" : "Asia/Tehran"} serializer = EmailsListSerializer(data=request.data) serializer.is_valid(raise_exception=True) # 可直接用字符串索引取字段 meeting_date = serializer.data['meeting_date'] meeting_timezone = serializer.data['time_zone']
内容的提问来源于stack exchange,提问作者Niloofar
相关产品推荐
相关产品推荐

