2009-09-22 117 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