ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] Django serialize를 사용하여 queryset을 json으로 변경하기
    Django 개발 2021. 9. 2. 18:39

    저번 포스팅과는 반대로 django queryset 데이터를 js로 보내기 위해 json 형식으로 변경하기 위한 방법을 소개하려고 한다.

    더불어 serialize를 사용하면 한글 데이터가 유니코드 형식으로 표시되는 현상을 해결하는 방법도 함께 포스팅할 예정이다.

     

    from django.core import serializers
    from django.http import JsonResponse
    
    def view(request):
      ...
      queryset = Model.objects.filter(id=id)
      queryset_json = serializers.serialize('json', queryset)
    
      return JsonResponse({'post_type': post_type, 'queryset_json': queryset_json})

    serializers를 import하여 원하는 쿼리셋을 변수에 저장한 후 serializers.serialize('json',변수) 형태로 변환하면 아주 간단하게 쿼리셋이 json 형태로 변환된다. 변환된 json을 JsonResponse를 통하여 js로 넘기면 된다.

     

    이렇게 하게 되면 queryset이 json형태가 아닌 문자열로 js에 전달된다. queryset_json.length가 1000이 넘는 기적..ㅎ

    그래서 넘겨줄 값이 하나라면 HttpResponse를 통해 넘겨라

    queryset_json = serializers.serialize('json',변수)
    
    return HttpResponse(queryset_json, content_type="text/json-comment-filtered")

     

    만약 여러개라서 위와 같이 JsonResponse를 통해 넘기고 싶다면 json.loads()를 해줘야 한다.

    import json
    
    def view(request):
      ...
      queryset_json = json.loads(serializers.serialize('json', queryset, ensure_ascii=False))
      
      return JsonResponse({'reload_all': False, 'queryset_json': queryset_json})

     

    $.ajax({
      type: "POST",
      url: '/user/address/',
      data: post_data,
      success: function(ajax_data) {
        console.log(ajax_data["queryset"]);
      }
    });

    ajax의 success 부분 function에서 ajax_data라는 이름으로 response를 전달받아 address 값을 찍어보면 대충 아래와 같은 값이 나온다.

    {"model": "...", "pk": 1, "fields": {"user": 1, "is_default": false, "delivery_name": "\uc9d1" ...

     

    여기서 delivery_name의 값을 보면 "\uc9d1"이라는 이상한 값으로 표시된다. 뿐만 아니라 한글 데이터가 모두 유니코드로 표시되는 현상이 나타난다. 오류를 찾아봤더니 JsonResponse가 아닌 HttpResponse로 보내는 과정에서 유니코드로 변환되는 케이스들도 있었지만 내 코드는 해당하지 않기 때문에 더 구글링을 해봤다.

     

    그러다 한 블로그 포스팅을 발견했다. 내용은 "json.dumps() 이용시 한글이 유니코드로 저장되는 현상 해결"이었는데 정말 어이없지만 혹시나 하는 마음에 serialize에도 똑같은 해결법을 적용해봤다. 그런데 이게 무슨일인가?!?! 한글이 아주 예쁘게 표시되었다.

     

    해결방법은 ensure_ascii=False를 추가해주면 된다.

    serializers.serialize('json', updated_address, ensure_ascii=False)
    반응형

    댓글

Written by 나도개발자.