모델 인스턴스나 QuerySet과 같은 데이터를 JSON형식의 파일로 변환하는 작업
Deserialize : 반대로 JSON 형식의 데이터를 정의된 포맷에 맞추어 다시 모델 인스턴스로 변환하는 작업
새로운 기능이기에 app을 새로 만들어줌 (python manage.py startapps polls_api)
라이브러리를 사용하기 위해
pip install djangorestframework
모델들을 serialize하기 위해서는 각 field를 매칭시켜주는 작업 필요 (자동으로 생성되는 id 포함해주기)
from rest_framework import serializers
from polls.models import Question
class QuestionSerializer(serializers.Serializer):
#Question 모델을 매칭 시키기 위함
id = serializers.IntegerField(read_only=True)
question_text = serializers.CharField(max_length=200)
pub_date = serializers.DateTimeField(read_only=True)
#새 Question 인스턴스를 생성하는데 사용
def create(self, validated_data):
return Question.objects.create(**validated_data)
def update(self, instance, validated_data): # instance는 업데이트할 기존 Question instance,
instance.question_text = validated_data.get('question_text', instance.question_text)
instance.save()
return instance
ModelSerializer를 사용하면 위 코드를
class QuestionSerializer(serializers.ModelSerializer):
class Meta:
model = Question
fields = ['id', 'question_text', 'pub_date']
로 줄일 수 있음
ModelSerializer 클래스는 모델의 필드를 기반으로 자동으로 필드를 생성해주는 시리얼라이저
코드
serializer를 이용해서 json 형태의 api 요청을 구현할 수 있게끔 코드 작성
장고에서 제공해주는 rest_framework를 사용하기 위해서 setting.py app에 rest_framework를 등록해주어야 제대로 동작함
reference
crud
create : post
read : get
update : put
delete : delete 메소드를 각자 사용함
api_view()를 이용해서 post를 사용하려면 괄호 안에 'POST'를 적어둬야함(기본 값은 'GET')
post와 get일때 경우를 나누기, data가 타당한지 체크하고 아닐 경우도 구현하기
200번대 : 정상적인 결과 ( 200 OK, 201 CREATED)
400번대 : 사용자의 잘못된 요청 ( 400 BAD REQUEST, 404 NOT FOUND)
500번대 : 서버 내부의 오류
코드
수정하거나 삭제하기 위해서는 상세한 페이지로 들어가야 하기에 urls.py에 코드 추가
put은 request의 data를 받아 serializer에 넣어서 새로고침
delete은 .delete()를 활용해 삭제 (상태 코드 : 204)
코드
method로 get, post를 각각 처리하기 보다는 클래스 기반으로 더 간결하게 처리 가능
그러기 위해서는 'from rest_framework.views import APIView' 필요
urls.py에서 수정도 필요함(메서드가 아닌 다른 클래스가 그것을 대체하기에)
또한 장고에서 지원하는 클래스의 상속등을 활용할 수 있기에 반복되는 코드등을 피할 수 있음
코드
get,post등의 작업은 반복이기에 기능이 구현되어 있는 mixin을 활용하는 것이 더 간단함
사용하기 위해서는 urls.py의 id를 pk로 바꿔줘야함
GenericAPIView는 pk로 url을 찾아오기 때문
generic을 사용하면 더욱 간단하게 구현이 가능
from rest_framework import generics
class QuestionList(generics.ListCreateAPIView):
queryset = Question.objects.all()
serializer_class = QuestionSerializer
class QuestionDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Question.objects.all()
serializer_class = QuestionSerializer
이미 generic.py에서 관련되어 있는 것들이 정의가 되어있기에 상속받아서 사용
코드
user를 추가하기 위해서 polls/models.py 에 다음 코드를 추가
owner = models.ForeignKey('auth.User', related_name='questions', on_delete=models.CASCADE , null=True)
#CASCADE는 owner가 삭제되면 Question도 삭제하라는 의미 # owner가 여러개의 question을 가짐
serializer에 pk로 참조
코드
장고에서 제공하는 user 생성 기능을 사용하기 위해 다음과 같이 코드 작성
from django.contrib.auth.forms import UserCreationForm 로 이미 만들어진 것을 import 해와서 사용
코드
api서버를 만들고 있기에 회원가입도 api서버에서 진행하기
vaildated_data를 활용해서 비밀번호 유효성 검사
비밀번호를 두개 받아서 두 개가 같은지 확인하여 중복성 검사
create함수를 만들어서 유저 생성하기
코드
로그인 로그아웃을 구현하기 위해 setting.py에 reverse_lazy로 구현
permission.py에서 객체가 권한(ex. 'get')을 가지면 동작하도록 설정
권한을 가져야만 수정할 수 있는 권리를 주게끔 코드를 설정
Postman은 RESTful API 테스트를 위한 플랫폼, 다양한 HTTP 요청을 보내고 응답 결과를 쉽게 확인할 수 있도록 도와줌, API요청과 응답 결과를 저장하고 공유할 수 있는 기능도 제공