Table of Contents
Serializer #
-
REST API를 제공하는 장고 애플리케이션은 JSON 데이터를 주고받을 수 있어야 한다. 이를 위해서는 DB 인스턴스를 JSON 데이터로 변환하거나, 반대로 JSON 데이터를 DB 인스턴스로 변환할 수 있어야 한다. 이러한 목적으로 DRF에서 제공하는 클래스가 바로 시리얼라이저이다.
-
시리얼라이즈 / 디시리얼라이즈 되어야 하는 모델의 필드들이 정의됨
- ModelSerializer를 사용해 대응하는 모델의 모든 필드, 또는 일부 정의 가능
Serializer 사용 #
- 시리얼라이저/디시리얼라이저 되어야 하는 필드 정의 필요
- create(), update() 메소드 정의 필요
- create(): 시리얼라이저를 대상으로 save() 메소드를 호출하여 DB 인스턴스를 생성할 때의 동작 정의
- update(): 시리얼라이저를 대상으로 save() 메소드를 호출하여 DB 인스턴스를 수정하고자 할 때의 동작 정의
Serializer 사용 예 #
class BoardSerializer(serializers.Serializer):
#시리얼라이저/디시리얼라이저 되어야 하는 필드들
id = serializers.IntegerField(read_only=True)
title = serializers.CharField(allow_blank=True, max_length=100)
content= serializers.TextField(allow_blank=True, allow_null=True)
def create(self, validated_data):
#유효성 검사를 통과한 데이터들을 바탕으로
#새로운 DB 인스턴스를 생성하고 반환
return Board.objects.create(**validated_data):
def update(self, instance, validated_data):
# 유효성 검사를 통과한 데이터들을 바탕으로
#기존의 DB 인스턴스를 수정하고 반환
instance.title = validated_data.get('title', instance.title)
instance.content = validated_data.get('content', instance.title)
ModelSeriliaer 사용 #
- Serializer를 만들시, 모델에 기반하여 Seriliazer 필드를 자동으로 만들어줌
- create(), update() 메소드가 기본으로 제공됨으로, 세부 구현이 필요하지 않다면 정의할 필요가 없음
ModelSerializer 사용 예 #
* 1)class Meta 작성
* model = 모델명
* fields = "__all__" 또는 직접명시
* 2)현재 존재하는 필드 외에 추가하려는 필드가 있을 경우
* serializer.SerializerMethodField()로 정의 필요
class BoardModelSerializer(serializers.ModelSerializer):
time = serializers.SerializerMethodField()
class Meta:
model = Board
fields=('id', ‘title', 'content')
get_time_of_selected_block(self, object):
View 정의 #
- Serializer 와 ModelSerializer를 사용하기 위한 veiw 정의
- safe 는 반환할 데이터 타입이 dict형인지 확인
- 아래의 예제는 dict형이 아닌 queryset을 반환하기 때문에 safe = False
-
create() 메소드 동작을 위한 view
def post(self, request, format=None): #생성할 인스턴스 내용 post_serializer = BoardSerializer( data = request.data, context{'user':request.user} ) if post_serializer.is_valid(): # save()를 통해 serialzier의 create() 메소드 실행, # 새로운 DB 인스턴스 생성 board = post_serializer.save() return JsonResponse( post_serializer.data, status = status.HTTP_201_CREATED, safe=False) return JsonResponse( post_serializer.errors, status = status.HTTP_400_BAD_REQUEST, safe=False)
-
update() 메소드 동작을 위한 view
def put(self, request, *args, **kwargs): # board = Board.objects.get(pk = kwargs['pk'] ) board = self.get_object() #수정할 인스턴스, 수정할 내용 update_serial = BoardSerializer(board, data=request.data) if update_serial.is_valid(): # save()를 통해 serializer의 update()메소드 실행, # DB 인스턴스 업데이트 update_serial.save() return JsonResponse( update_serial.data, status = status.HTTP_201_CREATED, safe=False ) return JsonResponse( update_serial.errors, status = status.HTTP_400_BAD_REQUEST, safe=False )
참고 문헌 #
- https://it-eldorado.tistory.com/70
- https://devkor.tistory.com/entry/03-Django-Rest-Framework-Serializer-View-%EA%B0%9C%EB%85%90-%EC%9D%B5%ED%9E%88%EA%B8%B0
- https://velog.io/@phyyou/DRF-%EA%B3%B5%EB%B6%80%ED%95%98%EA%B8%B0-6-ModelSerializer