바로 앞선 강의 22에서 test코드를 작성했는데요. 이제는 Pass하기위한 소스코드를 짜봐야겠조?---
구체적으로는 user request
에 대응하는 serializer 소스코드를 짜볼거에요. -> 그리고 나서 request
를 처리할 view를 짜는거고요. - > 마무리로 url을 짜서 API에 연결할 수 있도록 할게요.
'get_user_model`을 임포트 할게요.
그리고 rest_framework에서 제공하는 serializers모듈을 임포트 할게요.
여기서 우리는 Modelsirializer를 상속받아서 UserSerializer클래스를 짜볼게요.
참고로 모델 시리얼 라이저에 대한 정의는 짧게 아래와 같아요.
fields = ('email', 'password', 'name')
를 정의함으로써 읽거나 쓰기위한 필드 정의를 해주게되요. 유저생성에 쓰이게 되는 필드인데요. 추가로 다른 필드를 정의하길 원한다면 물론 추가해주면되요.
extra_kwargs = {'password': {'write_only' : True, 'min_length': 5}}
는 추가적인 셋팅을 하기위한 Meta클래스의 변수인데요.여기에서는 password 필드에 추가설정(쓰기전용, 최소 5글자 제한)을 하도록 할게요.
아래 create()메소드를 정의할건데요. 첫번째는 클래스가 인스턴스 생성시 이를 받기위한 self를 넣고 다음으로 validated_data를 받습니다. 물론 사용되는건 client에서 post요청시 이메일, 아이디, 비밀번호와 같은 정보를 딕셔너리로 던져줄때 이를 받는 매개변수에요.
그리고 create(self, validated_data)
메서드의 validated_data는 HTTP POST요청시 만들어지는데요. 이때 만들어지는 json이 두 번째 인자에요.
from django.contrib.auth import get_user_model
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
"""Serializer for the users object"""
class Meta:
model = get_user_model()
fields = ('email', 'password', 'name')
extra_kwargs = {'password': {'write_only' : True, 'min_length': 5}}
def create(self, validated_data):
"""Create a new user with encrypted password and return it"""
return get_user_model().objects.create_user(**validated_data)
generics?
CBV 이용시 정말 많은 이점이 있습니다. 아래 설명과 같이 거의 차려진 밥상과 같이 시리얼라이저를 가져와서 플러그를 꽂으면 끝나는 느낌이네요.1
CreateAPIView
post요청시 사용되는군요.
Used for create-only endpoints.
Provides a post method handler.
Extends: GenericAPIView, CreateModelMixin
네! 이게 끝이냐고요? 맞습니다. 한마디로 DB에 CreateAPIView를 이용하면 데이터 저장하는 것이 이렇게 단순하게 되요.
from rest_framework import generics
from user.serializers import UserSerializer, AuthTokenSerializer
class CreateUserView(generics.CreateAPIView):
"""Create a new user in the system"""
serializer_class = UserSerializer
우선 user
앱안에 urls.py파일을 만들게요.
app_name을 적고 user앱의 views를 임포트할게요. 그리고 path()메소드에 아래와 같이 작성할게요.
from django.urls import path
from user import views
app_name = 'user'
urlpatterns = [
path('create/', views.CreateUserView.as_view(), name='create'),
]