我有一个很大的序列化json字段,我试图从中提取多个键,然后构造另一个键json并通过请求发送它。例子:class ACtionViewSet(viewsets.ModelViewSet): logger = logging.getLogger('django') """ API endpoint """ queryset = Action.objects.all() serializer_class = ActionSerializer filter_backends = (filters.OrderingFilter, filters.SearchFilter, DjangoFilterBackend) filterset_class = ActionFilter # create new action for this workflow def create(self, request, *args, **kwargs): serializer = ActionSerializer(data=request.data, context={'request': request}) if serializer.is_valid(): serializer.save() encode_data = json.dumps(serializer.data) wanted_key = ['task', 'task_default', 'slug'] new_action = {x: encode_data[x] for x in wanted_key if x in encode_data} print(new_action) workflow = json.dumps(new_action) response = requests.post( url='{}/workflows'.format(MISTRAL_URL), json=workflow, headers=headers ) # logging.debug(f"{self.response}") return Response({'response': response}, status=status.HTTP_200_OK) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)错误是string indices must be integers我有点困惑为什么会发生这种情况,所以有人可以解释一下这里发生了什么,谢谢
2 回答

皈依舞
TA贡献1851条经验 获得超3个赞
该错误告诉您必须使用整数作为字符串索引,即"some string"[0]有效,"some string"['test']会引发上述问题。
这给了你一个看哪里的提示!即,encode_data是由 生成的字符串 json.dumps。
您可能可以删除json.dumps, 或者使用json.loadsifserialiser.data是一个字符串。
换句话说:
$ json.loads('{"foo": 123}')['foo']
> 123
$ json.dumps({'foo': 123})['foo']
> TypeError: string indices must be integers

qq_花开花谢_0
TA贡献1835条经验 获得超7个赞
json.dumps
返回一个字符串,意思encode_data
是一个字符串,而不是一个字典。
如果serializer.data
已经是一个字典,就按原样使用它,如果它是一个字符串使用json.loads(serializer.data)
在这一行上触发了错误:new_action = {x: encode_data[x] for x in wanted_key if x in encode_data}
在 python 中,字符串是可迭代的,但只能通过整数键访问,如列表。
my_string = "01234" my_char = my_string[3] # result is "3"
但您正在尝试像这样访问它:
my_data = my_string["key"]
这不起作用。
添加回答
举报
0/150
提交
取消