Serializer는 Frontend로 데이터를 보내기 위해 DB를 json으로 바꿀 때 사용된다.
class QuestionSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
question_text = serializers.CharField(max_length=200)
pub_date = serializers.DateTimeField(read_only=True)
def create(self, validated_data):
return Question.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.question_text = validated_data.get('question_text', instance.question_text)
instance.save()
return instance
일반적인 Serializer을 사용할때는 model에 이미 선언한 field를 다시 써야 하는 번거로움이 있다.
하지만 ModelSerializer를 사용하면 간단히 바꿀 수 있다.
class QuestionSerializer(serializers.ModelSerializer):
class Meta:
model = Question
fields = ['id','question_text', 'pub_date']
함수 기반의 뷰는 @api_view()라는 데코레이터를 사용해서 request 메소드가 무엇인지 명시한뒤 다수의 request 메소드를 사용할 경우 if 문으로 구분하여 처리하지만
클래스 기반의 뷰는 클래스를 만든뒤 리턴되는 함수를 통해 처리한다.
class QuestionList(APIView):
def get(self, request):
questions = Question.objects.all()
serializer = QuestionSerializer(questions, many=True)
return Response(serializer.data)
def post(self, request):
serializer = QuestionSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
클래스 뷰를 사용하며 얻는 이점 중 하나인 어떤 동작에 대해 재사용 가능한 코드를 작성할 수 있다는 것을 활용.
class QuestionList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Question.objects.all()
serializer_class = QuestionSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
DFR(Django Rest Framework)에서 클래스 기반 뷰의 형태로 로직을 구현학고 제네릭 뷰로 기능 제공.
특정 데이터 리소스에 대한 CRUD 액션을 지원하는 웹 API를 쉽고 효율적으로 구현 가능
class QuestionList(generics.ListCreateAPIView):
queryset = Question.objects.all()
serializer_class = QuestionSerializer