Computer Programming/AI

TIL_Django REST Framework(DRF)의 serializers 사용 방법

JYCoder 2023. 10. 7. 01:01

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 한다.

    {
        "pk": 1,
        "title": "first article",
        "image": "/media/image.jpg",
        "updated_at": "2023-10-06T08:45:22.412274Z",
        "user": "admin@gmail.com",
        "likes_count": 2,
        "comments_count": 3
    },

 

ArticleView의 post 방식은 ArticleCreateSerializer을 통과한 값은 'serializer.is_valid()'를 통해 데이터 검증 과정을 거치게 된다. 'serializer.is_valid()'를 사용하면 client로부터 받은 data가 model의 field와 일치하고, field 유효성 검사를 통과했는지를 확인할 수 있다. 이를 통해 잘못된 데이터를 방지하고 정확한 데이터만 모델에 저장하게 된다.

 

 

LIST