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/
'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 |