DRF 4-5 게시글 list, create

Grace Goh·2022년 11월 11일
0

Django Rest Framework

목록 보기
16/36
# articles/views.py

from rest_framework.views import APIView
from rest_framework import status, permissions
from rest_framework.response import Response
from articles.models import Article
from articles.serializers import ArticleSerializer


class ArticleView(APIView):
    def get(self, request): # article 불러오기
        articles = Article.objects.all() # 전부 불러오기
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

# articles/serializers.py

from rest_framework import serializers
from articles.models import Article


class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'

POSTMAN으로 확인해보면

id, title, content, ..., user까지 잘 들어온다.

게시글 전체 리스트에 (내용까지) 모두 받아오는 건 과할 수도 있다.
content를 제외하고 받으려면 serializer를 다음과 같이 수정한다.

# serializers.py

from rest_framework import serializers
from articles.models import Article


class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'
     
     
class ArticleListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ("pk", "title", "image", "updated_at", "user",) 
        # all이 아니라 필요한 것만 명시한다. 필드는 (튜플)로 쓴다.

# models.py

from rest_framework.views import APIView
from rest_framework import status, permissions
from rest_framework.response import Response
from articles.models import Article
from articles.serializers import ArticleSerializer, ArticleListSerializer # 추가


class ArticleView(APIView):
    def get(self, request):
        articles = Article.objects.all()
        # 아래 클래스명을 List로 변경함
        serializer = ArticleListSerializer(articles, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

user가 pk값으로 오고 있는데
username, nickname 또는 email로 오길 바란다면
serializer의 method field를 이용하면 된다.

DRF 공식 문서 정독하기
https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

# articles/serializers.py

from rest_framework import serializers
from articles.models import Article


class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'


class ArticleListSerializer(serializers.ModelSerializer):
    # user라는 attribute를 새로 만들어준다.
    user = serializers.SerializerMethodField()

    # 다음과 같은 형식을 지켜야 한다. get_변수 하면 연동이 된다.
    def get_user(self, obj): # obj: 해당 article
        return obj.user.email

    class Meta:
        model = Article
        fields = ("pk", "title", "image", "updated_at", "user")
        # (all이 아니라) 필요한 것만 명시한다.

필드를 (튜플)로 쓰는 것에 주의한다.

user를 pk값이 아닌 email로 받아왔다.

login API에서 access token을 받아와서 environment에 저장한다.

article creater > Headers에 아래와 같이 써준다.

다음과 같이 print()문을 쓰면 request.user를 인식하는 것을 알 수 있다.

# articles/views.py

from rest_framework.views import APIView
from rest_framework import status, permissions
from rest_framework.response import Response
from articles.models import Article
from articles.serializers import ArticleSerializer, ArticleListSerializer, ArticleCreateSerializer # 추가


class ArticleView(APIView):
    def get(self, request):  # article 불러오기
        articles = Article.objects.all() # 전부 불러오기
        serializer = ArticleListSerializer(articles, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

    # create
    def post(self, request):
        # print(request.user)
        serializer = ArticleCreateSerializer(data=request.data) # 변경
        if serializer.is_valid():
            serializer.save(user=request.user) # 
            return Response(serializer.data)
        else: # 실패한다면
            return Response(serializer.errors)

serializer는 front에서 온 것을 검증하는 것이라
backend에서 user 로직을 만드는 우리에게는 필요 없는 부분이다.
ArticleSerializer를 ArticleCreateSerializer로 고치고 상단에 import도 해주면 글이 작성된다.

아래와 같이 DB에서도 확인된다.

이미지를 보낼 때는 raw(json)가 아닌 form-data로 보낸다.

# article/serializers.py

from rest_framework import serializers
from articles.models import Article


class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'


class ArticleCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ("title", "image", "content") # 검증에 필요한 부분


class ArticleListSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()

    # 형식을 지켜야 한다. 변수 앞에 get_ 붙이면 연동이 된다.
    def get_user(self, obj): # obj: 해당 article
        return obj.user.email

    class Meta:
        model = Article
        fields = ("pk", "title", "image", "updated_at", "user") # 필요한 것만 명시
profile
Español, Inglés, Coreano y Python

0개의 댓글