[DRF]ModelSerializer


RESTframework의 ModelSerializer에 대해서 알아보겠습니다. 해당 게시물은 RESTframework의 공식문서를 참고하였습니다.


ModelSerializer

ModelSerializer클래스는 필드가 있는 모델의 Serializer를 쉽게 자동으로 만들어 주는 기능을 가지고 있습니다.

ModelSerializer클래스는 다음을 제외하고는 일반 Serializer클래스와 동일 합니다

  • 모델 기반으로 일련의 필드가 자동으로 생성.

  • unique_together validator와 같이 serializer에 대한 validator를 자동으로 생성.

  • .create() 및 .update()의 간단한 기본 구현이 포함됨.

다음과 같이 작성할 수 있습니다.

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

기본적으로 클래스의 모든 모델 필드는 해당 serializer 필드에 매핑됩니다.

모델의 외래 키와 같은 관계는 PrimaryKeyRelatedField에 매핑됩니다. serializer 관계 문서에 명시된대로 명시적으로 포함되지 않으면 역방향 관계가 기본적으로 포함되지 않습니다.

필드 지정하기

기본 직렬화 필드의 하위 집합 만 모델 직렬화 기에서 사용되도록하려면 ModelForm과 마찬가지로 필드를 사용하거나 옵션을 제외 할 수 있습니다. fields 속성을 사용하여 직렬화해야하는 모든 필드를 명시 적으로 설정하는 것이 좋습니다. 이렇게하면 모델 변경시 실수로 데이터가 노출 될 가능성이 줄어 듭니다.

예를 들면

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

모든 필드를 지정할 땐 '__all__'를 사용할 수 있습니다.

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

또한 excluede 속성을 사용하여 제외할 필드를 정의할 수 있습니다.

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

명시적으로 필드 지정하기

ModelSerializer에 추가 필드를 추가하거나 Serializer 클래스에서와 마찬가지로 클래스의 필드를 선언하여 기본 필드를 재정의 할 수 있습니다.

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

    class Meta:
        model = Account

읽기 전용 필드 지정하기

여러 필드를 읽기 전용으로 지정할 수 있습니다. read_only = True 속성을 사용하여 각 필드를 명시 적으로 추가하는 대신 바로 가기 메타 옵션 인 read_only_fields를 사용할 수 있습니다.

이 옵션은 필드 이름의 목록 또는 튜플이어야하며 다음과 같이 선언됩니다.

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

HyperlinkedModelSerializer

HyperlinkedModelSerializer클래스는 ModelSerializer클래스의 primary key가 아닌 관계를 나타 내기 위해 하이퍼 링크를 사용한다는 점을 제외 하면 클래스 와 유사 합니다.

기본적으로 serializer에는 primary key 대신 url을 포함시킵니다.

primary key를 fields옵션에 명시적으로 포함 시킬 수 있습니다.

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

Absolute and relative URLs

인스턴스를 만들때 현재 request를 포함해야 합니다.

serializer = AccountSerializer(queryset, context={'request': request})

이렇게하면 다음과 같이 Absolute URL을 사용할 수 있습니다.

http://api.example.com/accounts/1/