DRF4
Django REST framework 튜토리얼 #4
ModelSerializer
Serializer를 만들 때, 아래와 같이 Models.py를 작성하는 것처럼 모든 필드를 선언했다
# serializers.py
class SnippetSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
title = serializers.CharField(required=False, allow_blank=True, max_length=100)
code = serializers.CharField(style={'base_template' : 'textarea.html'})
linenos = serializers.BooleanField(required=False)
language = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')
def create(serlf, validated_Data):
return Snippet.objects.create(**validated_Data)
def update(self, instance, validated_data):
instance.title = validated_data.get('title', instance.title)
instance.code = validated_data.get('code', instance.code)
instance.linenos = validated_data.get('linenos', instance.linenos)
instance.language = validated_data.get('language', instance.language)
instance.style = validated_data.get('style', instance.style)
instance.save()
return instance
이렇다면 Serializer를 왜 쓰는지 도대체 이해가 안되지.
ModelSerializer
.create()
,.update()
)가 있다작성예시
from rest_framework import serializers
from status.models import Status
class StatusSerializer(serializers.ModelSerializer):
class Meta:
model = Status
class Meta 작성
__all__
, exclude, 직접 작성 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']
read_only_field = ['account_name']
editable=False
인 model fields, AutoField
fields는 default가 read_only이기 때문에 read_only_field를 사용할 필요가 없음
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = ['id', 'title', 'code', 'linenos', 'language', 'style']
class UserSerializer(serializers.ModelSerializer):
snippets = serializers.PrimaryKeyRelatedField(many=True, queryset=Snippet.objects.all())
class Meta:
model = User
fields = ['id', 'username', 'snippets']
owner = serializers.ReadOnlyField(source='owner.username')
Serializer relations
1. StringRelatedField(FK로 연결된 모델에서 __str__
method를 사용하는 경우)
class AlbumSerializer(serializers.ModelSerializer):
tracks = serializers.StringRelatedField(many=True)
class Meta:
model = Album
fields = ['album_name', 'artist', 'tracks']
{
'album_name': 'Things We Lost In The Fire',
'artist': 'Low',
'tracks': [
'1: Sunflower',
'2: Whitetail',
'3: Dinosaur Act',
...
]
}
2. PrimaryKeyRelatedField (pk를 반환)
class AlbumSerializer(serializers.ModelSerializer):
tracks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = Album
fields = ['album_name', 'artist', 'tracks']
{
'album_name': 'Undun',
'artist': 'The Roots',
'tracks': [
89,
90,
91,
...
]
}
3. HyperlinkedRelatedField (Fk로 연결된 필드의 API url(hyperlink)을 반환)
class AlbumSerializer(serializers.ModelSerializer):
tracks = serializers.HyperlinkedRelatedField(
many = True,
read_only = True,
view_name = 'track-detail'
)
class Meta:
model = Album
fields = ['album_name', 'artist', 'tracks']
{
'album_name': 'Graceland',
'artist': 'Paul Simon',
'tracks': [
'http://www.example.com/api/tracks/45/',
'http://www.example.com/api/tracks/46/',
'http://www.example.com/api/tracks/47/',
...
]
}