django rest framework:<object>不是JSON可序列化的

Aru*_* SS 2 python python-2.7 django-serializer django-rest-framework

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

{
    "states": [
        {
            "state_code":"CA",
            "state_name":"California"
        },
        {
            "state_code":"AL",
            "state_name":"Alabama"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

现在显示以下错误.

TypeError at /api/v1/us/states
<State:Alabama> is not JSON serializable
Run Code Online (Sandbox Code Playgroud)

views.py

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

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

[<State:Alabama>, <State:Alaska>, <State:Arizona>, <State:Arkansas>, <State:California>, <State:Colorado>, <State:Connecticut>, <State:Delaware>  <State:West Virginia>, <State:Wisconsin>, <State:Wyoming>]
Run Code Online (Sandbox Code Playgroud)

urls.py

urlpatterns = [
    url(r'^us/states', get_all_states),
]
Run Code Online (Sandbox Code Playgroud)

我没有使用任何序列化器.无论如何迭代状态并获取格式化的状态数据?

sim*_*rsh 6

当您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})
Run Code Online (Sandbox Code Playgroud)

因为你需要的只是一些静态数据,所以缓存它总是一个好主意.或者膨胀一次,以便在每次请求时都不会重复.

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})
Run Code Online (Sandbox Code Playgroud)

快乐的编码.