Django Rest Framework 공식 문서를 보면서 공부하기 위해 이 포스팅을 작성한다. 사실 필요하면 검색해서 갖다 쓰기 바빴기 때문에 이번 기회에 한 번 찬찬히 살펴보고자 한다.
이 시리즈가 끝날 때쯤에는 적재적소에 DRF를 적용할 수 있기를 바란다.
1. Serializer(직렬화)란 무엇인가?
우선 직렬화의 뜻을 살펴보자 아래는 위키백과에서 뜻을 인용했다.
직렬화 또는 Serialization은 컴퓨터 과학의 데이터 스토리지 문맥에서 데이터 구조나 오브젝트 상태를 동일하거나 다른 컴퓨터 환경에 저장(이를테면 파일이나 메모리 버퍼에서, 또는 네트워크 연결 링크 간 전송)하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정이다.
DRF(Django Rest Framework) 공식 문서에 보면 Serializer를 다음과 같이 설명한다.
Serializers allow complex data such as querysets and model instances to be converted to native Python datatypes that can then be easily rendered into JSON, XML or other content types. Serializers also provide deserialization, allowing parsed data to be converted back into complex types, after first validating the incoming data.
Serializer를 사용하면 쿼리 세트 및 모델 인스턴스와 같은 복잡한 데이터를 기본 Python 데이터 유형으로 변환한 다음 쉽게 JSON 또는 XML으로 렌더링 할 수 있습니다. Serializer는 역직렬화를 제공하여 먼저 수신 데이터의 유효성을 검사한 후 구문 분석된 데이터를 복합 유형으로 다시 변환할 수 있습니다.
정리하면 데이터를 다른 포맷으로 변환하는 과정이 직렬화이고 DRF에서의 직렬화의 의미는 Python의 자료형을 직렬화를 통해 JSON 또는 XML로 바꾼다고 생각하면 된다.
2. Serializer Field
Serializer Field의 역할은 다음과 같다.
Serializer fields handle converting between primitive values and internal datatypes. They also deal with validating input values, as well as retrieving and setting the values from their parent objects.
Serializer 필드는 기본 값과 내부 데이터 유형 간의 변환을 처리합니다. 또한 입력 값의 유효성 검사는 물론 상위 개체에서 값을 검색하고 설정하는 작업도 처리합니다.
그렇다면 첫 번째로 Serializer Field의 Core Argument를 살펴보자.
2.1 Core Arguments
2.1.1 read_only
읽기 전용 필드는 API 출력에 포함되지만 생성 또는 업데이트 작업 중에는 입력에 포함되어서는 안 된다. 즉 create나 update에는 read_only가 True가 된다면 해당 필드는 보이지도 않고 작업이 수행되지도 않는다. 만약 읽기만을 원할 때는 True로 지정하면 된다. 기본 값은 False이다.
2.1.2 write_only
read_only와 반대되는 개념이라고 보면 된다. 즉 해당 필드는 API 출력에는 포함되지 않지만, 생성 또는 업데이트 작업할 때는 필드가 사용할 수 있게 해 준다. 만약 생성 또는 업데이트를 원한다면 True로 지정하면 된다. 기본값은 마찬가지로 False이다.
2.1.3 required
역직렬화 중에 필드가 제공되지 않으면 일반적으로 오류가 발생한다. 하지만 required를 False로 설정하면 역직렬화 여기서는 JSON 혹은 XML 형태의 데이터를 받아 Python의 자료형으로 변환시킬 때 해당 필드를 채워 넣지 않아도 된다. 빈 값을 넣어도 통과한다.(Model Field에서 null이나 blank 속성을 지정하지 않아도) 기본값은 True이다. 만약 ModelSerializer를 사용하는 경우 False를 하면 Model FIeld에서 blank=True or default or null=True와 같다.
2.1.4 default
설정될 경우 입력 값이 제공되지 않은 경우 필드에 사용될 기본값을 설정한다. default는 부분 업데이트(partial update)의 경우에는 작동하지 않는다. 함수나 다른 callable로 설정할 수 있다. 호출되면 인수를 받지 않는다. default를 설정한다는 것은 암묵적으로 not required라는 것을 의미하므로 required를 같이 사용하면(True) error가 난다. callable에 requires_context = True 속성이 있으면 Serialzer field가 인수로 전달된다.
예를 들어:
# serializers.py
class CurrentUserDefault:
"""
May be applied as a `default=...` value on a serializer field.
Returns the current user.
"""
requires_context = True
def __call__(self, serializer_field):
return serializer_field.context['request'].user
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
class PostSerializer(serializers.ModelSerializer):
user = UserSerializer(default=CurrentUserDefault()) # 현재 로그인한 사용자의 인스턴스가 저장된다.
...
나머지는 다음 포스팅에서 이어서 하겠다.
잘못된 정보가 있을 수도 있으니 말씀해주시면 감사하겠습니다.
참고
1. https://www.django-rest-framework.org/api-guide/serializers/
2. https://www.django-rest-framework.org/api-guide/fields/
3. https://seulcode.tistory.com/218
'Django' 카테고리의 다른 글
[Pytest] - django-dotenv 와 pytest-dotenv 오류 (0) | 2022.12.19 |
---|---|
[DRF] - Serializers Class 알아보기(1) (0) | 2022.12.14 |
[DRF - Django Rest Framework] Serializer Field 톺아보기(3) (0) | 2022.12.13 |
Django Queryset - Lazy QuerySet 과 올바른 Caching 사용법 (0) | 2022.12.09 |
[DRF - Django Rest Framework] Serializer Field 톺아보기(2) (0) | 2022.12.07 |