繁体   English   中英

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

[英]string indices must be integers django rest framework

我有一个很大的序列化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

追溯:

File "/home/copser/.local/share/virtualenvs/api-IztWJwuB/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/home/copser/.local/share/virtualenvs/api-IztWJwuB/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "/home/copser/.local/share/virtualenvs/api-IztWJwuB/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/copser/.local/share/virtualenvs/api-IztWJwuB/lib/python3.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
  54.         return view_func(*args, **kwargs)

File "/home/copser/.local/share/virtualenvs/api-IztWJwuB/lib/python3.7/site-packages/rest_framework/viewsets.py" in view
  116.             return self.dispatch(request, *args, **kwargs)

File "/home/copser/.local/share/virtualenvs/api-IztWJwuB/lib/python3.7/site-packages/rest_framework/views.py" in dispatch
  495.             response = self.handle_exception(exc)

File "/home/copser/.local/share/virtualenvs/api-IztWJwuB/lib/python3.7/site-packages/rest_framework/views.py" in handle_exception
  455.             self.raise_uncaught_exception(exc)

File "/home/copser/.local/share/virtualenvs/api-IztWJwuB/lib/python3.7/site-packages/rest_framework/views.py" in dispatch
  492.             response = handler(request, *args, **kwargs)

File "/home/copser/Documents/Project/api/src/action/views.py" in create
  76.             new_workflow = {x: encode_data[x] for x in wanted_key if x in encode_data}

File "/home/copser/Documents/Project/NjiNN/njinn/api/src/action/views.py" in <dictcomp>
  76.             new_action = {x: encode_data[x] for x in wanted_key if x in encode_data}

Exception Type: TypeError at /api/v1/action
Exception Value: string indices must be integers

我有点困惑为什么会这样,所以有人可以解释一下这里发生了什么,谢谢

错误提示您必须使用整数作为字符串索引,即"some string"[0]起作用, "some string"['test']将引发上述问题。

那给你一个提示,看哪里! 即, encode_datajson.dumps生成的字符串。

如果serialiser.data是字符串,则可以删除json.dumps ,或者改用json.loads

换一种说法:

$ json.loads('{"foo": 123}')['foo']
> 123


$ json.dumps({'foo': 123})['foo']
> TypeError: string indices must be integers

json.dumps返回一个字符串,这意味着encode_data是一个字符串,而不是字典。

如果serializer.data已经是字典, json.loads(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"]

这不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM