저번 글에서 만든 TitleSearch API를 사용해보도록 하겠다.
우리는 urls.py에서 tsearch/ 로 들어왔을 때 views.py의 TitleSearch로 넘겨주었다.
TitleSearch는 다음과 같다.
class TitleSearch(APIView):
def get(self, request, format=None):
title_search = request.query_params.get('title_search', None)
if title_search is not None:
post = models.Post.objects.filter(title__contains=title_search)
serializer = serializers.PostSerializer(post, many=True)
return Response(data=serializer.data, status=status.HTTP_200_OK)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
TitleSearch는 get Method일 때, title_search라는 파라미터를 받아들여서 이를 이용해서 검색을 한다.
검색이 정상적으로 되는지 확인하기 위해 우리는 admin page에서 글을 세 개 정도 만들어보자.
만들었으니 parameter를 줘서 api 주소에 접속해보자.
http://127.0.0.1:8000/post/tsearch/?title_search=김가디
물론 브라우저에 다음과 같이 치면 한글을 urlencoding을 해주기 때문에 찾을 수 있으나
백엔드나 프론트엔드에서 api를 이용할 때는 urlencoding을 하여 다음과 같은 주소로 변경해야한다.
http://127.0.0.1:8000/post/tsearch/?title_search=%EA%B9%80%EA%B0%80%EB%94%94
접속하면 다음과 같이 뜬다.
rest framework를 쓰면 API를 사용할 때 다음과 같은 화면을 보여줘, 개발자에게 편리함을 제공한다.
어쨌든 API가 정상적으로 search_text가 포함된 title을 찾는 것을 확인할 수 있다.
게시글을 올리는 API도 만들어보자.
views.py에 다음 소스코드를 추가한다.
class Post(APIView):
def post(self, request, format=None):
serializer = serializers.PostSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(data=serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(data=serializer.errors, status=status.HTTP_400_BAD_REQUEST)
urls.py에 다음 소스코드를 추가하여 해당 url 접속 시 post api를 가르키도록 하자.
url(
regex=r'^post/$',
view=views.Post.as_view(),
name='post'
),
저장 후 http://127.0.0.1:8000/post/post/ url 접속 시 다음과 같은 화면이 뜬다.
우리가 GET은 정의하지 않았기 때문에 다음과 같은 에러코드가 뜨는 것이다.
아래의 Content에 json형태로 게시글 데이터를 보내면 게시글이 올라가는 지 확인을 해보자.
그 전에 Serializer를 다음과 같이 수정한다.
from rest_framework import serializers
from . import models
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = models.Comment
fields = (
'comment',
'owner_nick',
'created_at'
)
class PostDetailSerializer(serializers.ModelSerializer):
comments = CommentSerializer(many=True)
class Meta:
model = models.Post
fields = (
'title',
'owner_nick',
'comments',
'text',
'created_at',
)
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = models.Post
fields = (
'title',
'owner_nick',
'text',
'created_at',
)
PostDetailSerializer는 우리가 검색을 했을 때 댓글까지 보여주는 serializer이다.
PostSerializer는 게시글을 업로드할 때 사용하는 serializer이다.
또한 편리함을 위해 DateTimeField를 DateField로 수정해준 뒤 makemigration과 migrate를 통해 DB에 반영한다.
다음과 같이 입력하고 POST 해보자.
DB에 게시글이 올라갔는지 확인하기 위해 Admin Page로 이동해 확인해본다.
정상적으로 올라간 것을 확인할 수 있다.
댓글도 비슷하게 만들어주면 된다.
urls.py와 다음과 같이 추가
url(
regex=r'(?P<post_id>[0-9]+)/comments/$',
view=views.CommentOnPost.as_view(),
name='CommentOnPost'
),
view.py에 다음과 같이 추가
class CommentOnPost(APIView):
def post(self, request, post_id, format=None):
try:
found_post = models.Post.objects.get(id=post_id)
except models.Post.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
serializer = serializers.CommentSerializer(data=request.data)
if serializer.is_valid():
serializer.save(post=found_post)
return Response(data=serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(data=serializer.errors, status=status.HTTP_400_BAD_REQUEST)
댓글이 정상적으로 DB에 올라가고, 게시글도 향하는 것을 알 수 있다.
'WEB > Django' 카테고리의 다른 글
Django 파이썬 웹 프로그래밍(8) React 설치 (0) | 2020.08.17 |
---|---|
Django 파이썬 웹 프로그래밍(7) TextEditor 사용 + 설정 (0) | 2020.07.26 |
Django 파이썬 웹 프로그래밍(5) ADMIN 계정 설정 및 ADMIN PAGE (0) | 2020.07.26 |
Django 파이썬 웹 프로그래밍(4) Postgresql 설치 및 연결 (0) | 2020.07.26 |
Django 파이썬 웹 프로그래밍(3) Model과 View 그리고 Serializer (0) | 2020.07.26 |