Python/Django
Django - Serializers, CRUD
Porits789
2024. 3. 15. 10:36
Serializers
Serialize (직렬화) ↔ Deserialize
: 객체를 연속적인 데이터로 변환하는 것. JSON등의 데이터로 변환한다.
- 시리얼라이저 생성 시에 ModelSerializer를 통해 생성해주면 create, update 메서드의 별도 생성없이 구현 가능합니다.
# polls_api/serializers.py
from rest_framework import serializers
from polls.models import Question
class QuestionSerializer(serializers.ModelSerializer):
class Meta:
model = Question
fields = ['id','question_text','pub_date','is_something','average_score','json_field']
CRUD
CRUD: Create(생성), Read(읽기), Update(갱신), Delete(삭제)
Django의 CRUD는 직접 구현하는 방법도 있으나, Mixin,generic과 같은 보다 편리한 메서드를 활용하여 구현도 가능하다.
API_VIEW를 활용한 CRUD
다음은 간단한 GET 메서드를 구현하는 방법이다.
from rest_framework.decorators import api_view # 메소드 정의 시 사용
# 만약 여러 메서드를 사용하고 싶은 경우 @api_view(['GET','POST']) 다음과 같이 리스트로 넣어준다.
@api_view()
def question_list(request):
questions = Question.objects.all()
serializer = QuestionSerializer(questions ,many = True) # 여러개의 인스턴스를 줄 때에 many를 사용
return Response(serializer.data)
Generic
이런 CRUD를 이미 구현하여 보다 쉽고 코드를 간결하게 해준다. rest_framework의 generics를 활용하는 방식이다.
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
이렇게 적어주기만해도 CRUD가 모두 정상 작동한다.
-> generics에서 이미 구현해두었기 때문이다. 또한 각 기능을 별도로 설정 가능하다.
'RetrieveUpdateDestroyAPIView'에서 Destroy만 빼면 제거 기능만 제외한 설정이 가능하다.
에러 참고
초기 수행과정에서 rest_framework template가 정상 작동하지 않는 경우가 있었다. 다음 블로그를 참고하여 해결하였다.
https://velog.io/@ssongji/Django-API-기본-페이지-표출-시-오류-TemplateDoesNotExist-at-restquestion