RESTAPI 를 사용함에 있어서 Serializer를 사용하였는데 직렬화라는 뜻이라고 한다.
대충 기존 Django 모델을 json 형태로 응답을 할 수 있게 해주는 것이다.. 코드로 한 번 보자
지금 하려는 예시코드 의 주제는 사용자의 이름, 원작동화, 성별, 나이로 초기 정보를 받은 후 원작동화를 각색하는 것으로 그 원작 동화 안에서 새롭게 이야기를 만드는 주제이다!
아래의 model은 첫 시작인 초기정보를 저장하는 model이라고 보면된다.
내가 하려는 것은 클라이언트에게 user_id, username, fariytale, gender, age를 받고난 후, 다시 클라이언트에게 새롭게 생성된 책의 book_id와 받았던 초기 정보를 다시 응답해주는 api를 만들려고 한다.
# book/model.py
class Book(models.Model):
book_id = models.AutoField(primary_key=True)
user_id = models.ForeignKey(User, on_delete=models.CASCADE)
username = models.CharField(max_length=100)
fairytale = models.CharField(max_length=50)
gender = models.CharField(max_length=10)
age = models.IntegerField()
먼저 user_id, username, fariytale, gender, age를 서버에서 받아주기로 했다.
BookSerializer라는 이름으로 Serializer를 만들어주도록 하겠다.
# book/Serializer.py
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['user_id', 'username', 'fairytale', 'gender', 'age']
다음으로 BookCreateSerializer이라는 이름으로 Serializer를 만들어 준다.
book_id, username, fariytale, gender, age로 응답하기위해 만들어 주었다.
# book/Serializer.py
class BookCreateSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['book_id', 'username', 'fairytale', 'gender', 'age']
api 구현을 위해 views.py 파일에서 다음과 같이 작성을 해준다. (클래스뷰)
#동화책 초기 정보 불러오기
# book/views.py
from drf_yasg.utils import swagger_auto_schema
from rest_framework.views import APIView
from book.serializers import BookSerializer, BookCreateSerializer
class BaseBook(APIView):
def post(self, request):
serializer = BookSerializer(data=request.data)
if serializer.is_valid():
book_instance = serializer.save()
response_serializer = BookCreateSerializer(book_instance)
return Response({
'message': '초기 정보 입력 완료',
'result': response_serializer.data
}, status.HTTP_201_CREATED)
return Response({
'message': '유효하지 않은 입력값',
'result': serializer.errors
}, status.HTTP_400_BAD_REQUEST)
코드에 대한 설명을 해주자면,
값을 클라이언트에게 받고 생성을 해주는 것이라서 post 메서드이다.
serializer 변수에 BookSerializer(data=요청받은 값의 data) 를 담아주고 serializer에 들어있는 값이 유효한지(올바른 양식으로 값이 들어가 있는지) 확인하고 맞다면
book_instance 변수에 serializer.save()로 저장을 해준다.
다시 응답으로 돌려줄 변수 response_serializer에 BookCreateSerializer의 json data를 저장하고 Response로 돌려준다.
- 아주 간단하게 설명한 serializer의 개념의 참조 - https://devkor.tistory.com/entry/03-Django-Rest-Framework-Serializer-View-개념-익히기
'장고 > Python Django' 카테고리의 다른 글
Django urls.py - path, re_path (1) | 2024.01.22 |
---|