r잡초처럼
바른 프로그래밍
r잡초처럼
전체 방문자
오늘
어제
  • 분류 전체보기 (124)
    • FastAPI (7)
    • 끄적끄적 (2)
    • Python (17)
    • Django (31)
    • Database (2)
    • Docker (7)
    • 디자인패턴 (2)
    • CS 공부 (12)
      • 알고리즘 (2)
      • 자료 구조 (1)
      • 네트워크 (7)
      • IT 지식 (1)
      • 운영체제 (1)
    • 기타 팁들 (10)
    • Aws (2)
    • 독서 (1)
    • 코딩테스트 공부 (1)
      • 백준 (0)
      • 프로그래머스 (1)
    • DevOps (13)
    • TIL (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • encoding
  • 케이블의 종류
  • 완벽한 IT 인프라 구축을 위한 Docker
  • 7장
  • 5장 회사에서 하는 랜 구성
  • query param
  • poetry
  • 6장
  • 네트워크
  • pytest
  • dotenv
  • validate
  • 전기 신호
  • 랜 카드
  • docker
  • 컴퓨터 기본 지식
  • 책 리뷰
  • depends
  • 모두의 네트워크
  • cp949
  • Batch
  • CS 지식
  • pycharm
  • preonboarding
  • 상속 안티 패턴
  • 물리 계층
  • 상속과 컴포지션
  • fastapi
  • 파이썬 클린 코드
  • 랜과 왠

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
r잡초처럼

바른 프로그래밍

Django

[DRF] ModelSerializer 살펴보기

2023. 1. 11. 14:14

Serializer 클래스 중 Django Model과 매핑되는 ModelSerializer를 알아보자.

이 ModelSerializer 클래스는 모델 필드에 해당하는 필드를 사용하여 Serializer 클래스를 자동으로 만들 수 있는 shortcut을 제공한다. 

ModelSerializer 클래스는 Serializer 클래스와 대부분 같다. 아래의 경우를 제외하고,

  • 모델에 따라 필드가 자동으로 생성된다.
  • 자동으로 unique_together, validators와 같은 Seiralizer의 validator를 생성한다.
  • .create() 및 .update()의 간단한 기본 구현이 포함되어 있다.

ModelSerializer를 선언하면 아래와 같다.

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']

기본적으로 클래스의 모든 모델 필드는 해당 Seiralizer 필드에 매핑된다. 모델의 외부 키와 같은 모든 관계는 PrimaryKeyRelatedField에 매핑된다. 역방향 관계는 Seiralizer Relations에 명시적으로 포함되지 않는 한 기본적으로 포함되지 않는다. 

 

포함할 필드 지정

ModelSerializer에서 기본 필드 중 특정 필드만 사용하려는 경우 ModelForm에서와 마찬가지로 필드를 사용하거나 옵션을 제외할 수 있다. 필드 속성을 사용하여 직렬화해야 하는 모든 필드를 명시적으로 설정하는 것이 좋다. 이렇게 하면 모델이 변경될 때 데이터가 의도치 않게 노출될 가능성이 낮아지게 된다.

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']

또는 모든 필드를 아래와 같이 지정할 수 있다. 

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = '__all__'

제외할 필드만 지정할 수 있다. 

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        exclude = ['users']

중첩된 직렬화 지정

ModelSerializer는 관계에 기본 키를 사용하지만 깊이 옵션을 사용하여 중첩 표현을 쉽게 생성할 수도 있다.

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']
        depth = 1

명시적으로 필드 지정

클래스에 필드를 선언하여 ModelSerializer에 추가 필드를 생성하거나 기본 필드를 재정의 할 수 있다.

class AccountSerializer(serializers.ModelSerializer):
    url = serializers.CharField(source='get_absolute_url', read_only=True)
    groups = serializers.PrimaryKeyRelatedField(many=True)

    class Meta:
        model = Account
        fields = ['url', 'groups']

읽기 전용 필드 지정

여러 필드를 읽기 전용으로 지정할 수 있다. read_only = True 특성을 사용하여 각 필드를 명시적으로 지정하거나, meta option인 read_only_fields를 사용할 수 있다. 

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']
        read_only_fields = ['account_name']

editable = False 이거나 AutoField 가 있는 모델필드는 기본적으로 읽기 전용으로 설정된다.

 

읽기 전용 필드가 모델 수준에서 unique_together 제약 조건의 일부인 특수한 경우가 있다. 이 경우 필드는 제약 조건을 검증하기 위해 Seiralizer 클래스에서 필요하지만 사용자가 편집할 수 없어야 한다. 이를 처리하기 위한 올바른 방법은 serializer에서 명시적으로 read_only = True와 default =.. 키워드 인수를 모두 제공하는 것이다. 
user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())

자세한 내용은 Validators 문서에서 UniqueTogetherValidator와 CurrentUserDefault를 참고하자.

추가 키워드 인수

extra_kwrgs 옵션을 사용하여 필드에 임의의 추가 키워드 인수를 지정할 수 있다. 이는 필드에서 명시적으로 선언할 필요가 없음을 의미한다.

class CreateUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['email', 'username', 'password']
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        user = User(
            email=validated_data['email'],
            username=validated_data['username']
        )
        user.set_password(validated_data['password'])
        user.save()
        return user

만약 필드에 이미 선언된 경우 extra_kwargs 옵션은 무시된다.

관계 필드

model 인스턴스를 직렬화할 때 여러 가지 방법으로 관계를 나타낼 수 있다. ModelSerializer의 기본 표현은 관련 인스턴스의 기본 키를 사용하는 것이다. 자세한 내용은 serializer relations 문서를 참고하자.


참고

https://www.django-rest-framework.org/api-guide/serializers/

 

Serializers - Django REST framework

 

www.django-rest-framework.org

 

'Django' 카테고리의 다른 글

[Queryset] select_related와 prefetch_related 살펴보기  (0) 2023.01.13
[DRF] HyperlinkedModelSerializer 살펴보기  (0) 2023.01.12
Django의 특징  (1) 2022.12.24
Gunicorn에 대해 알아보자.  (0) 2022.12.23
[Pytest] - TestRunner 설정하기  (0) 2022.12.19
    'Django' 카테고리의 다른 글
    • [Queryset] select_related와 prefetch_related 살펴보기
    • [DRF] HyperlinkedModelSerializer 살펴보기
    • Django의 특징
    • Gunicorn에 대해 알아보자.
    r잡초처럼
    r잡초처럼
    오늘보다 내일 더 나은 개발자가 되기 위한 노력을 기록하는 블로그 입니다.

    티스토리툴바