10

AJAXを試すために使用している単純なビューがあります。

def get_shifts_for_day(request,year,month,day):

    data= dict()
    data['d'] =year
    data['e'] = month
    data['x'] = User.objects.all()[2]

    return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')

これにより、次が返されます。

TypeError at /sched/shifts/2009/11/9/

<User: someguy> is not JSON serializable

data ['x']行を取り出して、モデルを参照しないようにすると、機能し、次のように返されます。

{"e": "11", "d": "2009"}

simplejsonがデフォルトのdjangoモデルの1つを解析できないのはなぜですか?使用するどのモデルでも同じ動作が得られます。

4

1 に答える 1

29

.dumps呼び出しに、タイプがわからないデータを渡すときに何をすべきかをdefault=encode_myway知らせる引数を追加する必要があります。もちろん、「なぜ」の質問に対する答えは、貧弱な人に何を伝えていないかということです。モデルのインスタンスの1つを使用します。simplejsonsimplejson

encode_mywayそしてもちろん、JSONでエンコード可能なデータを提供するために書く必要があります。例:

def encode_myway(obj):
  if isinstance(obj, User):
    return [obj.username,
            obj.firstname,
            obj.lastname,
            obj.email]
    # and/or whatever else
  elif isinstance(obj, OtherModel):
    return [] # whatever
  elif ...
  else:
    raise TypeError(repr(obj) + " is not JSON serializable")

基本的に、JSONは非常に基本的なデータ型(文字列、int、float、dictとlistにグループ化)について知っています-アプリケーションプログラマーとして、他のすべてをそのような基本simplejson的なデータ型と照合するのはあなたの責任です。または時間default=に渡される関数。dumpdumps

jsonまたは、 Djangoの一部であるシリアライザーを使用することもできます。ドキュメントを参照してください。

于 2009-09-22T01:57:34.460 に答える