【问题标题】:TypeError: Object of type 'DoesNotExist' is not JSON serializable ( Django REST Framework)TypeError:“DoesNotExist”类型的对象不是 JSON 可序列化的(Django REST 框架)
【发布时间】:2020-07-05 04:59:22
【问题描述】:

完整的回溯(heroku):

2020-03-24T16:11:47.624938+00:00 app[web.1]: Internal Server Error: /api/register_domain_name
2020-03-24T16:11:47.624949+00:00 app[web.1]: Traceback (most recent call last):
2020-03-24T16:11:47.624950+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
2020-03-24T16:11:47.624951+00:00 app[web.1]: response = get_response(request)
2020-03-24T16:11:47.624952+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 158, in _get_response
2020-03-24T16:11:47.624952+00:00 app[web.1]: response = self.process_exception_by_middleware(e, request)
2020-03-24T16:11:47.624953+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 156, in _get_response
2020-03-24T16:11:47.624953+00:00 app[web.1]: response = response.render()
2020-03-24T16:11:47.624953+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/django/template/response.py", line 106, in render
2020-03-24T16:11:47.624954+00:00 app[web.1]: self.content = self.rendered_content
2020-03-24T16:11:47.624954+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/rest_framework/response.py", line 72, in rendered_content
2020-03-24T16:11:47.624955+00:00 app[web.1]: ret = renderer.render(self.data, accepted_media_type, context)
2020-03-24T16:11:47.624955+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/rest_framework/renderers.py", line 105, in render
2020-03-24T16:11:47.624956+00:00 app[web.1]: allow_nan=not self.strict, separators=separators
2020-03-24T16:11:47.624956+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/rest_framework/utils/json.py", line 28, in dumps
2020-03-24T16:11:47.624957+00:00 app[web.1]: return json.dumps(*args, **kwargs)
2020-03-24T16:11:47.624957+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/json/__init__.py", line 238, in dumps
2020-03-24T16:11:47.624958+00:00 app[web.1]: **kw).encode(obj)
2020-03-24T16:11:47.624959+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/json/encoder.py", line 199, in encode
2020-03-24T16:11:47.624959+00:00 app[web.1]: chunks = self.iterencode(o, _one_shot=True)
2020-03-24T16:11:47.624960+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/json/encoder.py", line 257, in iterencode
2020-03-24T16:11:47.624961+00:00 app[web.1]: return _iterencode(o, 0)
2020-03-24T16:11:47.624961+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/rest_framework/utils/encoders.py", line 68, in default
2020-03-24T16:11:47.624962+00:00 app[web.1]: return super(JSONEncoder, self).default(obj)
2020-03-24T16:11:47.624962+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/json/encoder.py", line 180, in default
2020-03-24T16:11:47.624963+00:00 app[web.1]: o.__class__.__name__)
2020-03-24T16:11:47.624963+00:00 app[web.1]: TypeError: Object of type 'DoesNotExist' is not JSON serializable

当我调用 api func 时会发生这种情况:

@api_view(['POST'])
@permission_classes((IsAuthenticated,))
@authentication_classes((TokenAuthentication,))
@ensure_csrf_cookie
@renderer_classes((JSONRenderer,))
def register_domain_name(request):
    if request.method == 'POST':
        data = request.POST
        address = data.get('address', False)
        tot_amt = data.get('tot_amt', False)
        blocktime = data.get('blocktime', False)
        txid = data.get('txid', False)
        try:
            user = User.objects.get(userprofile__zeal_address=address)
        except Exception as e:
            return Response({'status': 'failed', 'error': e })

        last_dri = DomainRegistrationItem.objects.filter(user=user).order_by('-request_date')[0]

        if tot_amt == last_dri.get_total_price:
            domain_name = last_domain_reg_item.domain

            domain = Domain.objects.create(name=domain_name, created_by=user)

            domain_name_order = DomainNameOrder.objects.create(
                from_address=address,
                price=tot_amt,
                blocktime=blocktime,
                txid=txid,
                domain_registration_item=last_dri,
                domain_item=domain,
                years=last_dri.years,
            )

            last_dri.purchased = True
            last_dri.save()

            return Response({'status': 'success'})
        else:
            return Response({'status': 'failed'})

我认为这可能与我尝试 .get() 一个对象('DoesNotExist' 不可序列化)有关,但唯一一次发生这种情况时,我使用了 try/except。我搜索了标题中的错误,没有得到任何结果。有人可以帮忙吗?

有人可以帮忙吗?提前致谢。

【问题讨论】:

    标签: python django heroku django-rest-framework


    【解决方案1】:

    你是对的,异常 'DoesNotExists' 是由于 get 引发的,但是由 try/except 块正确处理(事件虽然你应该避免捕获过于广泛的异常,但如果你只捕获 “不存在”)。

    您遇到的错误是因为您在响应中传递了异常(“e”)。异常不是 JSON 可序列化引发 TypeError。

    您可能只想添加异常消息而不是整个对象。或者您可以定义自己的序列化程序(这对于这个用例来说可能有点过头了)。

    仅发送异常文本的示例:

    try:
        user = User.objects.get(userprofile__zeal_address=address)
    except Exception as e:
        return Response({'status': 'failed', 'error': e.message })
    

    【讨论】:

      猜你喜欢
      • 2019-09-28
      • 2021-06-18
      • 2021-12-03
      • 2020-12-13
      • 1970-01-01
      • 2022-07-01
      • 2023-01-10
      • 2020-12-02
      • 2019-04-29
      相关资源
      最近更新 更多