from rest_framework import serializers
from .models import Article, Comment
class ArticleListSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ('id', 'title', 'content')
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('articles/', views.article_list),
]
views.py
from django.urls import is_valid_path
from articles.serializers import ArticleListSerializer, ArticleSerializer, CommentSerializer
from .models import Article, Comment
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework import status
from django.shortcuts import get_object_or_404, get_list_or_404
@api_view(['GET'])
def article_list(request):
if request.method == 'GET':
# articles = Article.objects.all()
articles = get_list_or_404(Article)
serializer = ArticleListSerializer(articles, many=True)
return Response(serializer.data)
일단 나중의 전체 과정을 위해 편의상 필요한 모듈, 함수 import 해왔음
serializer의 매개변수는 articles와 many=True 설정
GET요청만 받도록 데코레이터 지정
포스트맨 확인
게시글 생성하기
serializers.py
from rest_framework import serializers
from .models import Article, Comment
class ArticleListSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ('id', 'title', 'content')
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
새로운 ArticleSerializer생성, 필드는 '__all__'
views.py
from django.urls import is_valid_path
from articles.serializers import ArticleListSerializer, ArticleSerializer, CommentSerializer
from .models import Article, Comment
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework import status
from django.shortcuts import get_object_or_404, get_list_or_404
@api_view(['GET', 'POST'])
def article_list(request):
if request.method == 'GET':
# articles = Article.objects.all()
articles = get_list_or_404(Article)
serializer = ArticleListSerializer(articles, many=True)
return Response(serializer.data)
# 이 부분 추가!!!!
elif request.method == 'POST':
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
생성은 method가 POST
유효성 검사하는 함수에 raise_exception=True로 지정해주면 맨 밑에 에러와 400상태를 리턴하는 것 빼줘도 됨
유효성 검사를 통과했다면 201상태를 보여줌
포스트맨 확인
특정 게시글 조회
serializers.py
from rest_framework import serializers
from .models import Article, Comment
class ArticleListSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ('id', 'title', 'content')
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('articles/', views.article_list),
path('articles/<int:article_pk>/', views.article_detail),
]
views.py
from django.urls import is_valid_path
from articles.serializers import ArticleListSerializer, ArticleSerializer, CommentSerializer
from .models import Article, Comment
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework import status
from django.shortcuts import get_object_or_404, get_list_or_404
@api_view(['GET'])
def article_list(request):
if request.method == 'GET':
# articles = Article.objects.all()
articles = get_list_or_404(Article)
serializer = ArticleListSerializer(articles, many=True)
return Response(serializer.data)
@api_view(['GET'])
def article_detail(request, article_pk):
# article = Article.objects.get(pk=article_pk)
article = get_object_or_404(Article, pk=article_pk)
if request.method == 'GET':
serializer = ArticleSerializer(article)
return Response(serializer.data)
article_detail 함수 만들어 주기
article은 article_pk를 받아 쿼리셋을 찾아낸다.
이 함수에서 수정과 삭제 기능을 넣어줄 것.
포스트맨 확인
데이터 삭제, 수정하기
views.py
from django.urls import is_valid_path
from articles.serializers import ArticleListSerializer, ArticleSerializer, CommentSerializer
from .models import Article, Comment
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework import status
from django.shortcuts import get_object_or_404, get_list_or_404
@api_view(['GET', 'POST'])
def article_list(request):
if request.method == 'GET':
# articles = Article.objects.all()
articles = get_list_or_404(Article)
serializer = ArticleListSerializer(articles, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@api_view(['GET', 'DELETE', 'PUT'])
def article_detail(request, article_pk):
# article = Article.objects.get(pk=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()
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)
기존 있던 article_detail함수에 메서드 추가, 동작 추가
포스트맨 확인
전체 댓글 조회하기
serializers.py
from rest_framework import serializers
from .models import Article, Comment
class ArticleListSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ('id', 'title', 'content')
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
# 이 부분 만들어주기!!
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = '__all__'
read_only_fields = ('article',)
serializers.py에 CommentSerializer클래스 추가
Meta의 read_only_fields에 article을 넣어준 것은 후에 유효성검사할때 article은 확인 하지 않도록 하기 위함이다.
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('articles/', views.article_list),
path('articles/<int:article_pk>/', views.article_detail),
path('comments/', views.comment_list),
]