Django模型不是ajax可序列化的

时间:2009-09-22 01:41:10

标签: ajax django json django-models django-views

我有一个简单的观点,我正在尝试使用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"}

为什么simplejson不能解析我的默认django模型之一?我对使用的任何模型都有相同的行为。

1 个答案:

答案 0 :(得分:29)

您只需在.dumps调用中添加default=encode_myway参数,让simplejson知道在向其传递其不知道类型的数据时该怎么做 - 回答你的“为什么”问题当然是你没有告诉穷人simplejson如何处理你的某个模型的实例。

当然,您需要编写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知道非常基本的数据类型(字符串,整数和浮点数,分为字典和列表) - 作为应用程序员,您有责任将所有其他内容与这些基本数据类型进行匹配,并在{{ 1}}通常通过在simplejsondefault=时传递给dump的函数来完成。

或者,您可以使用属于Django的dumps序列化程序,请参阅the docs