【问题标题】:django rest framework: <object> is not JSON serializabledjango rest 框架:<object> 不是 JSON 可序列化的
【发布时间】:2017-08-13 06:51:06
【问题描述】:

我已安装“us”模块 (https://pypi.python.org/pypi/us) 以获取美国各州。它打印状态列表。我想以以下格式在 API 中显示它。

{
    "states": [
        {
            "state_code":"CA",
            "state_name":"California"
        },
        {
            "state_code":"AL",
            "state_name":"Alabama"
        }
    ]
}

现在显示以下错误。

TypeError at /api/v1/us/states
<State:Alabama> is not JSON serializable

views.py

@api_view(['GET'])
def get_all_states(request):
    states = us.states.STATES
    print (states)
    return Response({'states':states})

当我打印状态时,它具有以下格式。

[<State:Alabama>, <State:Alaska>, <State:Arizona>, <State:Arkansas>, <State:California>, <State:Colorado>, <State:Connecticut>, <State:Delaware>  <State:West Virginia>, <State:Wisconsin>, <State:Wyoming>]

urls.py

urlpatterns = [
    url(r'^us/states', get_all_states),
]

我没有为此使用任何序列化程序。反正有没有遍历状态并获取格式化的状态数据?

【问题讨论】:

    标签: python python-2.7 django-rest-framework django-serializer


    【解决方案1】:

    当您在响应中返回 dict 时,django 会考虑并将其作为 application/json 内容类型的响应返回。它使用json 库对其进行序列化。 dict 是可序列化的,但 State 对象不是。你需要自己给它充气。像这样。

    @api_view(['GET'])
    def get_all_states(request):
        states = [{'state_code': x.abbr, 'state_name': x.name} for x in us.states.STATES]
        print (states)
        return Response({'states': states})
    

    由于您只需要某种静态数据,因此缓存它总是一个好主意。或者膨胀一次,这样就不会在每个请求上重复。

    US_STATES = [{'state_code': x.abbr, 'state_name': x.name} for x in us.states.STATES]
    
    @api_view(['GET'])
    def get_all_states(request):
        return Response({'states': US_STATES})
    

    快乐编码。

    【讨论】: