# 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") # 필요한 것만 명시