2013-05-28 2 views
55

i를의 검색어를 직렬화하는 다음과 같은 코드가 있습니다;<장고 개체>하지 JSON 직렬화

def render_to_response(self, context, **response_kwargs): 

    return HttpResponse(json.simplejson.dumps(list(self.get_queryset())), 
         mimetype="application/json") 

그리고 다음은 내 내가 직렬화 할 필요가 get_querset()

[{'product': <Product: hederello()>, u'_id': u'9802', u'_source': {u'code': u'23981', u'facilities': [{u'facility': {u'name': {u'fr': u'G\xe9n\xe9ral', u'en': u'General'}, u'value': {u'fr': [u'bar', u'r\xe9ception ouverte 24h/24', u'chambres non-fumeurs', u'chambres familiales',.........]}] 

. 하지만 그것은 <Product: hederello()> 직렬화 할 수 없습니다 말했다. 왜냐하면 목록은 django 객체와 dicts로 구성되기 때문입니다. 어떤 아이디어?

답변

65

simplejsonjson 잘 장고 오브젝트 작동하지 않습니다.

장고에 내장 된 serializers에만 장고 개체 가득 검색어 세트를 직렬화 할 수 있습니다

귀하의 경우
data = serializers.serialize('json', self.get_queryset()) 
return HttpResponse(data, content_type="application/json") 

self.get_queryset() 내부 장고 개체와 dicts의 혼합을 포함한다. 도움이

from django.forms.models import model_to_dict 

data = self.get_queryset() 

for item in data: 
    item['product'] = model_to_dict(item['product']) 

return HttpResponse(json.simplejson.dumps(data), mimetype="application/json") 

희망 :

하나의 옵션은 self.get_queryset()에 모델 인스턴스를 제거하고 model_to_dict를 사용하여 dicts로 교체받을 것입니다.

+0

이제 점점 오류 ->' 'NoneType'개체가 어떤 속성 'concrete_model''이 없습니다 .. . 그리고 사용 장고 1.4 – tunaktunak

+0

나는 대답을 편집했습니다. 도움이되는지 확인하십시오. – alecxe

+2

모델에 datetime 필드가 있으면 작동하지 않습니다. – ax003d

5

먼저 내 모델에 to_dict 방법을 추가; 그런 다음

def to_dict(self): 
    return {"name": self.woo, "title": self.foo} 

나는이있다;

class DjangoJSONEncoder(JSONEncoder): 

    def default(self, obj): 
     if isinstance(obj, models.Model): 
      return obj.to_dict() 
     return JSONEncoder.default(self, obj) 


dumps = curry(dumps, cls=DjangoJSONEncoder) 

마지막 사용에서이 클래스

내 검색어 세트를 직렬화합니다.

def render_to_response(self, context, **response_kwargs): 
    return HttpResponse(dumps(self.get_queryset())) 

이 아주 잘 작동

나는 이것이 ".values"방법, 또한 이름이 부여합니다 필드를 사용하지 않고 간단하게 수행 할 수 있음을 발견
12

:

result_list = list(my_queryset.values('first_named_field', 'second_named_field')) 
return HttpResponse(json.dumps(result_list)) 

"목록"이어야합니다 "값의 검색어"타입은 반복 가능한로 촬상하는 경우에만 딕셔너리 때문에, 반복 가능한 같은 데이터를 얻기 위해 사용된다.

은 문서 : 1.9 쉬운 버전 및 JSON

from django.http import JsonResponse 
from django.forms.models import model_to_dict 


return JsonResponse( model_to_dict(modelinstance)) 
+0

이것은 나를 위해 잘 작동했습니다.오류 메시지가 그것이 하나의 큰 목록에 있음을 암시하더라도,'list()'는 여전히 명백하게 필요합니다. – trpt4him

+0

가장 단순하고 최상의 솔루션 – Timur

3

JsonResponse를 사용하는 것입니다. 의 검색어에 대한

, 당신과 같이 그의 검색어에 대해하여 values의 목록을 통과해야합니다

from django.http import JsonResponse 

queryset = YourModel.objects.filter(some__filter="some value").values() 
return JsonResponse({"models_to_return": list(queryset)})