Django

Django [관리자페이지] JSON으로 데이터 보내기

nyanguk 2021. 2. 11. 23:31

JSON

JSON이란

효율적으로 데이터를 저장 및 교환 하는데 사용되는 텍스트 데이터 포맷 중 하나이며 (JavaScript Object Notation) 의 약자이다.

 

JSON의 구조

  • 이름/값 쌍의 집합 {name:value ...}
  • 리스트 [v1,v2,...]
그러니까 내가 보내고자 하는 데이터들은 딕션너리나 리스트로 이루어져야만 하는 것이다. 데이터가 딕션너리와 리스트가 반복된 복잡한 형태인 경우더라도 그것은 프론트에서 값을 풀어내기만 할 수 있게 전달하면 되는 것이다.

 

JSON 데이터로 보내는 방법

1. 직접 파이썬 객체를 JSON 데이터로 쓰기,직렬화, 인코딩 

2. 쿼리셋을 리스트로 변환하여 JsonResponse로 보내기 

https://dev-yakuza.posstree.com/ko/django/response-model-to-json/

https://simpleisbetterthancomplex.com/tutorial/2016/07/27/how-to-return-json-encoded-response.html

3.  rest_framework 의 serializers를 사용하여 직렬화, Response로 보내기

https://darrengwon.tistory.com/480

https://www.django-rest-framework.org/api-guide/serializers/

 

 

 

 

 

 

 

 

 

 

 

이전 게시물에서 만들었던 카테고리별 게시글 띄우기를 자바스크립트를 사용하여 구현 해보고자 한다.

먼저 html에서 자바스크립트를 이용하여 데이터를 표시하게 될 경우 요청에 의한 데이터는 json의 형태로 전달되어야 한다.

 

 

 

파이썬에서의데이터를 JSON으로 변환하기

먼저 자바스크립트로 데이터를 조회하기 위해서는 파이썬에서는 딕션어리 타입으로 저장된 데이터를 JSON으로 변환하여 전달해야 한다.

 

 

 

 

 

 

실전예제

데이터를 딕션어리 타입으로 변환하기

이전 코드를 살펴보자 

# Custom_admin/post/views.py
from django.shortcuts import render, get_object_or_404
from .models import Post ,Category
# Create your views here.
posts=Post.objects.all()
categorys =Category.objects.all()
def home(requset):
    post_category = []
    for category in categorys:
        post_category.append(Post.objects.filter(category = category))
    context = {
        'post_category' : post_category,
    }
    return render(requset ,'post/base.html', context)

위의 코드에 따라 post_category가 어떤 형식의 JSON Object를 보내야 하는지 정리해본다.

카테고리에 따라 게시글'들'이 저장되므로 리스트 형태를 띄고있어야 할 것이다. 그래서 아래 와 같은 구조를 가질 것 이다.

post_category{   
            category1:[
                        {seq:1 , username: 'nyanguk', created_at:"...",title: "...",text:"...", ...},
                        {seq:2 , username: 'nyanguk', created_at:"...",title: "...",text:"...", ...},
                        {seq:3 , username: 'nyanguk', created_at:"...",title: "...",text:"...", ...}
            ],
            category2:[
                        {seq:1 , username: 'nyanguk', created_at:"...",title: "...",text:"...", ...},
            ],
            .
            .
            .
}

위와 같은 구조를 만들기 위해 먼저 쿼리셋 타입을 딕션너리 타입으로 바꿔줘야 할 필요가 있다. 

아 ,,, 헷갈리는게 너무많아...

 

참고블로그

딕션너리와 리스트 다루기 https://ojava.tistory.com/124

쿼리셋 타입-> 딕션너리 타입 https://brownbears.tistory.com/277

rest_framework 공식문서 https://www.django-rest-framework.org/api-guide/serializers/