본문 바로가기

Django

DRF serializer

그러면 이제 url과 view를 작성하는 법은 대충 알았다.

이제는 로직을 작성해볼건데 작성하기전 serializer에 대해 좀 알고 있어야한다. (위 두줄 제거 생각해보기)

view의 내용은 api_view의 DRF 함수형뷰 api view 에서 이어진다.

간단히 설명하자면 serializer는 기본적으로 데이터가 보여야 하는 방식을 설명해주는 녀석이다.

django에선 필요 model을 검증하고 JSON 객체로 변환해준다.

일단 코드를 작성해본다.

# file을 새로 생성해준다.
# users/serializers.py
from rest_framework import serializers

class UserSerializer(seiralizers.Serializer):
  """
  models.py에서 api 필드에서만 노출 시키고자 하는 속성만 빼내온다.
  작성법은 models.py랑 비슷하다.
  """
  name = serializers.CharField(max_length=140)
  phone = serializers.CharField(max_length=13)
  birthday = serializers.CharField(max_length=50)

일단 머리에 박고 있어야하는 개념 한가지는 django의 serializer는 python에서 JSON 객체로 바꿔주는것을 의미한다.
or JSON객체에서 python 객체로 바꿔주는것도 포함이다.

이제 view의 로직을 작성해보자 (위에 작성한 view 부분을 가져와 로직만 채워넣어본다)

# users/views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer

@api_view(["GET"])
def list_user(request):
  users = User.objects.all()
  serialized_users = UserSerializer(user, many=True)
  return Response(data=serialized_users.data)

이렇게 하면 정상적으로 페이지가 뜰거다. 하지만 이렇게 맨날 정상적으로만 뜬다면 얼마나 좋을까

UserSerializer를 호출하는 부분을 보면 many=True 가 있다 이 부분을 제거하고 serialized_users = UserSerializer(user) 만 입력하고 페이지를 reload 시켜보자 그러면 에러 내용이 상당히 긴걸 볼 수 있다.

보기 싫다고 안보지 말고 한번 차분히 보면 뭐 serializer 이름을 잘 못 지었네, 예외 텍스트, 쿼리 name 속성을 가지고 있지 않다고 하는데 다 맞는 말이긴 하지만 정확히 알아야할 내용은 우리가 위 코드 내용에서 query 한 걸 보면 all() 즉, User 전체를 불러오고 있다는걸 알 수 있다.

하지만 serializer 내용을 보면 한명의 User를 위한 내용이기에 여러 User에 대한 내용을 이해 못하는것이다.
이럴때 django에서는 친절하게 many=True를 사용함으로써 문제를 수정 할 수 있다.

이제 그러고 runserver를 하면 DB에 저장되어있는 User의 list를 볼 수 있을것이다.

그리고 코드에서 정의한 속성만 뽑아서 보여지고 있다.

serializer를 사용함으로 자연스레 JSON으로 변환되는걸 확인하고 나니 정말 많은걸 해주고 있다고 생각이 든다.

'Django' 카테고리의 다른 글

Django User model Custom  (0) 2021.06.29
DRF ModelSerializer  (0) 2021.06.19
DRF 함수형 뷰 (@api_view)  (0) 2021.06.19
django rest framework에 대해서  (0) 2021.06.19
(django template) typescript 적용시키기  (0) 2021.03.13