2

米国の州を取得するために 'us'モジュール(https://pypi.python.org/pypi/us)をインストールしました。状態リストを表示します。私はこれを以下の形式のAPIに表示したいと思います。django rest framework:<object>はJSONシリアライズ可能ではありません

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

私はこのための任意のシリアライザを使用していない

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

urls.py。とにかく州を繰り返して、フォーマットされた州のデータを取得することはありますか?

答えて

5

応答で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}) 

ハッピーコーディング。

関連する問題