为了账号安全,请及时绑定邮箱和手机立即绑定

字符串索引必须是整数 django rest 框架

字符串索引必须是整数 django rest 框架

POPMUISE 2021-10-26 18:36:46
我有一个很大的序列化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


查看完整回答
反对 回复 2021-10-26
?
qq_花开花谢_0

TA贡献1835条经验 获得超6个赞

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"]

这不起作用。


查看完整回答
反对 回复 2021-10-26
  • 2 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信