[DRF #4] Django REST framework

LILO Ghim·2022년 1월 1일
0

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

  • model을 기반으로 자동으로 필드 세트 생성
  • ModelForm과 매우 유사하지만, Json 데이터로 변환해줌
  • Serializer필드를 자동으로 생성
  • unique_together validator와 같은 serializer에 대한 validator 제공
  • 기본으로 사용하는 함수(.create(),.update() )가 있다

작성예시

from rest_framework 	import serializers
from status.models 	import Status

class StatusSerializer(serializers.ModelSerializer):
	class Meta:
		model = Status

class Meta 작성

  • model = 모델명
  • fields = __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


모델에서 ForeignKey로 연결되어 있는 필드의 경우, 다른 설정이 없으면 참조하고 있는 pk값을 가져옴


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/',
        ...
    ]
}
profile
킴릴로

0개의 댓글