programing

JSON 시리얼화 불가

goodsources 2023. 3. 12. 10:46
반응형

JSON 시리얼화 불가

쿼리셋을 시리얼화하기 위한 코드는 다음과 같습니다.

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

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

그리고 다음은 나의get_quersety()

[{'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로 구성되어 있기 때문입니다.좋은 생각 있어요?

simplejson그리고.jsondjango 오브젝트는 잘 작동하지 않습니다.

Django의 내장 시리얼라이저는 django 오브젝트로 채워진 쿼리셋만 시리얼화할 수 있습니다.

data = serializers.serialize('json', self.get_queryset())
return HttpResponse(data, content_type="application/json")

당신의 경우,self.get_queryset()에는 안에 django 오브젝트와 딕트가 혼재되어 있습니다.

한 가지 옵션은 에서 모델인스턴스를 삭제하는 것입니다.self.get_queryset()를 사용하여 딕트로 대체한다.model_to_dict:

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")

가장 쉬운 방법은 Json Response를 사용하는 것입니다.

쿼리셋의 경우 다음과 같이 해당 쿼리셋의 목록을 전달해야 합니다.

from django.http import JsonResponse

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

이름 있는 필드도 제공하는 ".values" 메서드를 사용하면 이 작업을 쉽게 수행할 수 있습니다.

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

"value queryset" 유형은 반복 가능한 것으로 선택될 경우 받아쓰기에 불과하므로 "list"를 사용하여 데이터를 반복할 수 있어야 합니다.

문서: https://docs.djangoproject.com/en/1.7/ref/models/querysets/ #values

버전 1.9부터 json을 쉽고 공식적으로 입수할 수 있는

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


return JsonResponse(  model_to_dict(modelinstance) )

js-programmer는 저에게 json 인코딩 문자열 대신 정확한 JSON 포맷 데이터를 반환해 달라고 요청했습니다.

해결책은 다음과 같습니다.(브라우저에서 바로 사용하거나 볼 수 있는 개체가 반환됩니다.)

import json
from xxx.models import alert
from django.core import serializers

def test(request):
    alert_list = alert.objects.all()

    tmpJson = serializers.serialize("json",alert_list)
    tmpObj = json.loads(tmpJson)

    return HttpResponse(json.dumps(tmpObj))

모델을 사용하는 동안 이 문제를 해결하는 또 다른 좋은 방법은values()기능.

def returnResponse(date):
    response = ScheduledDate.objects.filter(date__startswith=date).values()
    return Response(response)

먼저 모델에 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()))

이것은 꽤 잘 작동한다.

Django 모델의 경우 다음을 시도해 보십시오.

users = User.objects.all()   
return JsonResponse ({'data' : list(users)}) 

언급URL : https://stackoverflow.com/questions/16790375/django-object-is-not-json-serializable

반응형