Djangoのモデルは、Ajax直列化可能ではありません
-
12-09-2019 - |
質問
私は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
私はデータを取り出した場合は、[「X」]行、私はそれが動作する任意のモデルを参照すると、これを返していないよようにます:
{"e": "11", "d": "2009"}
なぜ、デフォルトのDjangoのモデルの私の1を解析のsimplejsonできないのですか?私が使用するすべてのモデルと同じ動作を取得ます。
解決
あなたの質問はもちろんである「なぜ」あなたの答え - あなたはそれをその種類、それは知らないデータを渡す際に
あなたはただ.dumps
は何をすべきかを知っているように、あなたのdefault=encode_myway
呼び出しで、simplejson
引数を追加する必要がありますはモデルのインスタンスのいずれかをどうするか、の貧しいsimplejson
に語っていない。
そして、もちろん、あなたは例えば、JSON-符号化可能なデータを提供するために、encode_myway
を記述する必要があります。
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型や山車、)については非常に基本データタイプを知っている - それは、このような基本データ型から/に他のすべてと一致するように、アプリケーションプログラマとしてのあなたの責任だ、とsimplejson
中だという通常default=
またはdump
時dumps
に渡された関数を使用して行われます。
所属していません StackOverflow