Django REST FRAMEWORK Tutorial 5 -- シリアライザでモデルを継承して短く書く
Tags: django, restframework
Published: 2022-04-18 18:05:26


## 前提

docker-compose.yml を作成できていて

```yml
    command: python manage.py runserver 0.0.0.0:8001
    volumes:
      - .:/code
    ports:
      - "8002:8001"
```

localhost 8002 のアクセスで

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zmboyr4f3d5oen6bddkx.png)

Django のロケットページが出るようになっていてる状態
ターミナルでテーブルの読み書きができる状態

---

## これまでの models と serializers

https://www.django-rest-framework.org/tutorial/1-serialization/#using-modelserializers

```py
class Snippet(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
    style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)

    class Meta:
        ordering = ['created']
```

snippets/models.py に

created, title, code, linenos, language, style,

これらのカラム名とデータの型たちを定義して
Meta を作って
一括して作成日順に並べる。

https://yu-nix.com/blog/2021/2/24/django-meta/

Meta の使い方はこのサイトが詳しかった。

```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=LANGUAGE_CHOICES, default='python')
    style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')
```

serializer では

id, title, code, linenos, language, style, 

これらのフィールドをシリアライズする。

model と比べると created がなくて id が増えている。

---

## shell で model とシリアライザの動作確認

```php
dc run web python manage.py shell

Starting rest5_db_1 ... done
Creating rest5_web_run ... done
Python 3.10.1 (main, Dec 21 2021, 06:15:32) [GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 
```

まだ view には組み込んでないので、shell を起動して

```py
from snippets.serializers import SnippetSerializer
serializer = SnippetSerializer()
print(repr(serializer))
```

Snippet のシリアライザを出力する

```py
SnippetSerializer():
    id = IntegerField(read_only=True)
    title = CharField(allow_blank=True, max_length=100, required=False)
    code = CharField(style={'base_template': 'textarea.html'})
    linenos = BooleanField(required=False)
    language = ChoiceField(choices=[('abap', 'ABAP'),
```

すると、シリアライザの型が表示される。

---

## Serializer の id ~ style の再定義をモデルから継承して省略する

```py
class SnippetSerializer(serializers.ModelSerializer):
```

Snippetシリアライザの引数を
普通のシリアライザから、Modelシリアライザに変更し

```py
    class Meta:
        model = Snippet
        fields = ['id', 'title', 'code', 'linenos', 'language', 'style']
```

id ~ style のカラムの再定義している内容を
model とフィールドを指定することで引き継ぐ。


## shell で 短く書いた Snippetシリアライザを出力してみる

```py
from snippets.serializers import SnippetSerializer
serializer = SnippetSerializer()
print(repr(serializer))
```

```py
SnippetSerializer():
    id = IntegerField(label='ID', read_only=True)
    title = CharField(allow_blank=True, max_length=100, required=False)
    code = CharField(style={'base_template': 'textarea.html'})
    linenos = BooleanField(required=False)
    language = ChoiceField(choices=[('abap', 'ABAP'),
```

全く同じようにカラムの型が表示される。