Serializer 이용해서 DB 정보를 json
형태로 front에 불러오기.
json을 돌려주는 backend를 만든 것.
> front에서는 이 data를 받아서 JS로 읽어서 그려주면 된다.
어떻게 그릴지는 front에서 결정.
한 backend에 모바일앱, 웹 등 다양한 client 가능하다.
API 열어두면 (날씨 등처럼) 횟수당 요금을 charging하는 '데이터 판매'도 가능하다.
json 형태로 주고 받는 정보가 많다 : 날씨, 공공데이터포털 등
먼저 articles/serializers.py에서
from rest_framework import serializers
from articles.models import Article # Article 모델 받아오기
# 모델을 기반으로 Serializer 만들기
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article # 모델이 Article 모델이다.
fields = "__all__" # 모든 필드를 다 다루겠다.
이것을 articles/views.py에서 쓰는 방법은
from rest_framework.response import Response
from rest_framework.decorators import api_view
from articles.models import Article
from articles.serializers import ArticleSerializer # 추가
@api_view(['GET'])
def index(request):
articles = Article.objects.all()
article = articles[0]
serializer = ArticleSerializer(article) # 이하를 수정
return Response(serializer.data) # serializer.data 해야 한다.
가져온 article 데이터를 ArticleSerializer 안에 넣으면
Serializer가 그 데이터를 시리얼라이즈 해서 변수에 저장한다.
저장된 값을 Response()
에 넣는다.
serializer
라는 인스턴스(객체)는
Serializer를 통과하여 만들어진 결과값이기 때문에
우리가 원하는 데이터는
serializer(인스턴스).data(어트리뷰트)
에 저장돼 있다.
인스턴스 안에 data라는 어트리뷰트가 있어서 그 안에 저장돼 있는 것.
어트리뷰트 없이 Response(serializer)
만 할 경우 다음과 같은 오류가 발생한다.
'Serializer의 인스턴스가 들어왔으나, 당신이 의도한 것은 .data
나 .error
였을 것이다.'
위와 같이 여러 개가 들어있는 쿼리셋
를 불러올 때는
many=True
를 추가하면 [리스트 형태]로 리턴된다.
(추가 안 하면 '쿼리셋에는 title 항목이 없다'는 오류가 발생한다)
# ...
@api_view(['GET'])
def index(request):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True) # 변수가 복수
return Response(serializer.data)