DRF(Django REST Framework)에서 serializers를 사용하여 article을 불러오고 생성하는 방법에 대해 알아보자.
우선 urls.py에서 url을 지정해 준다.
#urls.py
from django.urls import path
from articles import views
urlpatterns = [
path('articles/', views.ArticleView.as_view(), name='article_view'),
]
그리고 views.py에서 ArticleView를 작성해 준다.
#views.py
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.response import Response
from articles.models import Article
from articles.serializers import ArticleListSerializer, ArticleCreateSerializer
class ArticleView(APIView):
def get(self, request):
articles = Article.objects.all()
serializer = ArticleListSerializer(articles, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def post(self, request):
serializer = ArticleCreateSerializer(data=request.data)
if serializer.is_valid():
serializer.save(user = request.user)
return Response(serializer.data, status=status.HTTP_200_OK)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Articles를 화면에 보여주기 위해서 Article.objects.all()로 Database에서 모든 Articles를 불러오고 varialbe인 articles에 저장한다. articles는 여러 개의 Article들이기 때문에 'many=True'로 하고 'ArticleListSerializer'을 통해 JSON 형식으로 변환한다. 이 때 쓰인 'ArticleListSerializer'은 아래와 같이 작성한다.
from rest_framework import serializers
from articles.models import Article, Comment
class ArticleListSerializer(serializers.ModelSerializer):
user = serializers.SerializerMethodField()
likes_count = serializers.SerializerMethodField()
comments_count = serializers.SerializerMethodField()
def get_user(self, obj):
return obj.user.email
def get_likes_count(self, obj):
return obj.likes.count()
def get_comments_count(self, obj):
return obj.comments.count()
class Meta:
model = Article
fields = ("pk", "title", "image", "updated_at", "user", "likes_count", "comments_count")
class ArticleCreateSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ("title", "image", "content")
serializers를 import하고 원하는 data fields를 정해줄 수 있다. 여기서는 fields = ("pk", "title", "image", "updated_at", "user", "likes_count", "comments_count") 이러한 data field를 보여주기를 원하고, user은 id 값이 아닌 email 값을 보여주고 싶기 때문에 SerializerMethodField()를 이용했다. likes_count와 comment_count 또한 SerializerMethodField()를 이용하여 'get_' method로 각각의 count() 값을 return 했다.
이렇게 ArticleView의 get은 request.data 값이 ArticleListSerializer을 통해 다음과 같은 형식의 data를 return 한다.
ArticleView의 post 방식은 ArticleCreateSerializer을 통과한 값은 'serializer.is_valid()'를 통해 데이터 검증 과정을 거치게 된다. 'serializer.is_valid()'를 사용하면 client로부터 받은 data가 model의 field와 일치하고, field 유효성 검사를 통과했는지를 확인할 수 있다. 이를 통해 잘못된 데이터를 방지하고 정확한 데이터만 모델에 저장하게 된다.
'Computer Programming > AI' 카테고리의 다른 글
TIL_DRF(Django REST Framework) project, Frontend에서 게시글 내용 받아서 DB에 저장하기 (0) | 2023.10.10 |
---|---|
WIL_아홉 번째 주 (0) | 2023.10.08 |
TIL_Cookie/Session 방식과 Token 방식의 차이점 (0) | 2023.10.05 |
TIL_JWT(JSON Web Token) (0) | 2023.10.04 |
TIL_HTTP, HTTPS, SSH란? (0) | 2023.10.02 |