2009-09-22 3 views
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 

나는 데이터를 가지고가는 경우에 [ 'X'] 온라인 나는 어떤 작동 모델 반환이 참조하고 있지 않다 있도록 :

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

왜 simplejson이 기본 django 모델 중 하나를 구문 분석 할 수 없습니까? 내가 사용하는 모든 모델에서 동일한 동작을 얻습니다. 당신이 그것을 그 종류가 알고하지 않는 데이터를 통과 할 때

+0

모호한 질문, 질문의 제목에 실제로 질문이 없습니다. – geejay

답변

29

당신은 simplejson이 무엇을 알려, 당신의 .dumps 호출하는 default=encode_myway 인수를 추가 할 필요가 -에 대한 답을 당신의 "왜"질문은 물론입니다 당신은 에게이라고 말하면서 simplejson 모델의 인스턴스 중 하나를 어떻게 처리해야하는지 알려주지 않았습니다.

물론 당신은 예를 들어, JSON-encodable 데이터를 제공하기 위해 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 치의과 수레, dicts 및 목록으로 그룹화) 일반적으로 default=에 전달 된 함수 (dump 또는 dumps 시간)를 통해 수행되는 simplejson에서 모든 것을 일치시키는 것은 애플리케이션 프로그래머로서의 책임입니다.

또는 장고의 일부인 json 시리얼 라이저를 사용할 수 있습니다 (the docs 참조).

+0

+1 내장 된 시리얼 라이저에 대한 참조입니다. –

+2

django는 최종 사용자에게 어떤 속성이 실제로 중요한지 (물론 사용자가 모델에서 정의한 속성을 기반으로) 중요한지를 아는 데 충분히 똑똑 할 수 없으며 기본적으로 ##의 고통을 줄일 수 없습니까? –