2009-09-22 121 views
10

我有一个简单的观点,我正在使用AJAX进行实验。Django模型不是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模型?我使用任何模型都会得到相同的行为。

+0

模棱两可的问题,实际上不是问题标题中的问题 – geejay 2009-11-27 15:59:46

回答

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知道非常基本数据类型(字符串,整型和浮点型,组合成字典和列表) - 作为应用程序员,您有责任将其他所有元素与这些基本数据类型进行匹配,并在simplejson中完成,这通常是通过传递给default=dumpdumps时间的函数完成的。

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

+0

+1用于引用内置序列化程序。 – 2009-09-22 06:48:46

+2

不能让django足够聪明地知道什么属性真的很重要(当然是基于用户在模型中定义了什么属性)给最终用户,并在默认情况下减少a ##中的这种痛苦? – 2011-12-29 16:07:39