단일 모델의 data를 Serialization 하여 JSON으로 변환하는 방법에 대해 알아보자.
# articles/urls.py
urlpatterns = [
path('articles/', views.article_list),
]
# drf/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('api/v1/', include('articles.urls')),
]
# articles/views.py
def article_list(request):
pass
class Article(models.Model):
title = models.CharField(max_length=10)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
$ python manage.py migrate
$ python manage.py loaddata articles.json
$ pip install djangorestframework
# settings.py
INSTALLED_APPS = [
'articles',
'rest_framework', # DRF 등록
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
# articles/serializers.py
from rest_framework import serializers
from .models import Article
class ArticleListSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ('id', 'title', 'content')
.create()
및 .update()
의 간단한 기본 구현 포함됨$ python manage.py shell_plus
from articles.serializers import ArticleListSerializer
>>> serializer
ArticleListSerializer():
id = IntegerField(label='ID', read_only=True)
title = CharField(max_length=10)
content = CharField(style={'base_template': 'textarea.html'})
>>> article = Article.objects.get(pk=1)
>>> serializer = ArticleListSerializer()
>>> serializer
ArticleListSerializer():
id = IntegerField(label='ID', read_only=True)
title = CharField(max_length=10)
content = CharField(style={'base_template': 'textarea.html'})
# serialized data 조회
>>> serializer.data
{'id': 1, 'title': 'Summer region chance benefit avoid alone.', 'content': 'Try country perform increase hotel. Why shake grow poor for moment hit.\nHouse town week gun window but benefit.'}y country perform increase hotel. Why shake grow poor for moment hit.\nHouse town week gun window but benefit.'}
many=True
를 작성해야 함articles = Article.objects.all()
# many = True 옵션 X
>>> serializer = ArticleListSerializer(articles)
>>> serializer.data
AttributeError: Got AttributeError when attempting to get a value for field `title` on serializer `ArticleListSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on
the `QuerySet` instance.
Original exception text was: 'QuerySet' object has no attribute 'title'.
# many=True 옵션 O
>>> serializer = ArticleListSerializer(articles, many=True)
>>> serializer.data
[OrderedDict([('id', 1), ('title', 'Summer region chance benefit avoid alone.'), ('content', 'Try country perform increase hotel. Why shake grow poor for moment hit.\nHouse town week gun window but benefit.')]), ...]
# articles/urls.py
from django.urls import path
from articles import views
urlpatterns = [
path('articles/', views.article_list),
]
# articles/views.py
from django.shortcuts import render
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Article
from .serializers import ArticleListSerializer
# Create your views here.
@api_view(['GET'])
def article_list(request):
articles = Article.objects.all()
serializer = ArticleListSerializer(articles, many=True)
return Response(serializer.data)
api_view
decorator# articles/serializer.py
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
# articles/urls.py
urlpatterns = [
path('articles/', views.article_list),
path('articles/<int:article_pk>/', views.article_detail),
]
# articles/views.py
from .serializers import ArticleListSerializer, ArticleSerializer
@api_view(['GET'])
def article_detail(request, article_pk):
article = Article.objects.get(pk=article_pk)
serializer = ArticleSerializer(article)
return Response(serializer.data)
# articles/views.py
from rest_framework import status
# Create your views here.
@api_view(['GET', 'POST'])
def article_list(request):
if request.method == 'GET':
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# articles/views.py
@api_view(['GET', 'POST'])
def article_list(request):
if request.method == 'GET':
articles = Article.objects.all()
serializer = ArticleListSerializer(articles, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = ArticleListSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
# articles/views.py
@api_view(['GET', 'DELETE'])
def article_detail(request, article_pk):
article = Article.objects.get(pk=article_pk)
if request.method == 'GET':
serializer = ArticleSerializer(article)
return Response(serializer.data)
elif request.method == 'DELETE':
article.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
@api_view(['GET', 'DELETE', 'PUT'])
def article_detail(request, article_pk):
article = get_object_or_404(Article, pk=article_pk)
if request.method == 'GET':
serializer = ArticleSerializer(article)
return Response(serializer.data)
elif request.method == 'DELETE':
article.delete()
data = {
'delete': f'데이터 {article_pk}번 글이 삭제되었습니다.',
}
return Response(data, status=status.HTTP_204_NO_CONTENT)
@api_view(['GET', 'DELETE', 'PUT'])
def article_detail(request, article_pk):
article = Article.objects.get(pk=article_pk)
if request.method == 'GET':
serializer = ArticleSerializer(article)
return Response(serializer.data)
elif request.method == 'DELETE':
article.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
elif request.method == 'PUT':
serializer = ArticleSerializer(article, data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)