Django REST Framework とは？（Python アプリケーション）

この記事は [Django Advent Calendar 2021](https://qiita.com/advent-calendar/2021/django) の最終日の記事です。


# はじめに
はじめまして。

普段から **Django** を使用してWebアプリを開発しています。

 - [シルトレンド](https://siru-trend.com)

今年の [Django Advent Calendar 2021](https://qiita.com/advent-calendar/2021/django) も楽しく拝見させて頂きました。

今年の Django Advent Calendar では
数年前に比べて **Djangoそのもの** だけではなく
**Django REST Framework(DRF)** について言及されている記事が増えた気がします。

そこで、今年はこの記事でも Django REST Framework について記載したいと思います。

この記事が Django のより一層の普及に少しでも貢献できれば幸いです。



# 目次
- [Django とは？](#django-とは)
- [Django REST Framework とは？](#django-rest-framework-とは)
- [Django REST Framewrk の特徴](#django-rest-framewrk-の特徴serializer)
- [Serializer とは？](#serializer-とは)
- [Models にデータを格納するときに Serializer を使う](#models-にデータを格納するときに-serializer-を使う)
- [Views でリクエストを処理するときに Serializer を使う](#views-でリクエストを処理するときに-serializer-を使う)

# Django とは？
一言で述べると、**Python Web アプリケーションフレームワーク**です。

Django を使うことで Python で Web アプリケーションを簡単に作ることができます。

Django を使った Web アプリケーションを作成については以下の記事にまとめました。

 - [Pythonさえ分かればDjangoでWebアプリは作れる](https://qiita.com/pythonista/items/19613663ef7bb3c57d4f)

現時点で、Django は Python Web アプリケーションフレームワーク の中で最も使われています。



# Django REST Framework とは？
Django REST Framework (DRF) とは **RESTful API 開発に特化した** Django のフレームワークです。

DRF を使うことでより RESTful な Web アプリケーションを作成することができます。

なお、RESTful API とは
REST という原則を守っている HTTP 呼び出しインターフェースのことです。

「RESTful API とは？」や「REST とは？」については以下の記事が分かりやすいです。

https://qiita.com/NagaokaKenichi/items/0647c30ef596cedf4bf2



# Django REST Framewrk の特徴（Serializer）
では、そんな DRF の特徴とは何なのでしょうか？

全てを挙げ出すとキリがないのですが、
個人的に一番の特徴は **Serializer** にあると思います。

そこで、この記事では DRF の Serializer について解説していこうと思います。


## Serializer とは？
Serializer とはざっくり説明すると、
**さまざまなタイミングでデータの正当性をチェックできる機能**です。

Web アプリケーションが動いている中で以下のタイミングでデータの中身を精査することができます。

- Models にデータを格納するとき
- Views でリクエストを処理するとき

それぞれのタイミングでの使い方を説明していきます。

## Models にデータを格納するときに Serializer を使う
Django で作成したアプリケーションが動く中でデータベースに値を格納する場面は多いでしょう。

そのようなときに Serializer を使うことで、値の正当性をチェックすることができます。

### Serializer 定義
```python
from rest_framework import serializers

from api.models.user import User


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = (
            'id',
            'first_name',
            'last_name',
            'email',
            'password',
        )
```

このような Serializer を定義して値の格納時に呼び出すことで
必須フィールドの過不足をチェックして
おかしな値を格納することを防ぐことができます。


### Serializer を使った値のバリデーション
```python
user_serializer = UserSerializer(
    data={
        'first_name': 'hoge', 
        'last_name': 'fuga', 
        'email': 'test@example.com', 
        'password': 'XXX'
        }
)
```


#### （おまけ）動的に作成したい値を定義する
`serializers.SerializerMethodField()` を使うことで Models に定義した get_XXX をコールすることもできる

```python
class UserSerializer(serializers.ModelSerializer):
    full_name = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = (
            'id',
            'name',
            'email',
            'password',
        )

    def get_value(self, obj):
        return obj.hoge()
```


## Views でリクエストを処理するときに Serializer を使う

アプリケーションの中でリクエストを受け取って処理することがあるでしょう。

Serializerを使うことで、その Request Body の中身を精査することができます。


### Serializer 定義

```python
from rest_framework import serializers

class LoginValidator(serializers.Serializer):
    email = serializers.CharField()
    password = serializers.CharField()
```

上記のように Serializer を定義して、これを View 関数で使用します。


### Views で Serializer を使う
```python
from rest_framework import status
from rest_framework.response import Response

from api.serializers.validators import LoginValidator


class EmailLogin:
    def post(self, request, format=None):
        if not login_serializer.is_valid():
            return Response(
                self.build_error_response('パラメータが不正です'),
                status=status.HTTP_400_BAD_REQUEST
            )
        ...
```

このようにすることで不正な Request を受け取ったときのアプリケーションの挙動を定義することができます。


なお、Serializer によってバリデーションした後のデータを参照することもできます。


### validate 済みのデータを参照する
```python
email = login_serializer.validated_data['email']
address = login_serializer.validated_data.get('address')
```


こうすることで、安全なデータをアプリケーションの中で使うことができます。



# さいごに

最後まで読んで下さり、ありがとうございます。

Django REST Framework を使ってデータの正当性をチェックすることで
**より堅牢で安全なアプリケーション**を作成することができます。

アプリケーションさえ作ってしまえば、
サーバやドメインを用意して世界中にサービスとして公開することができます。

なお、Webサービスの作成については以下の記事にまとめています。

- [最も低コストでプロダクトを公開したい](https://qiita.com/Taro_man/items/cea8c095fe8680ab12f3)
- [数十円で作ったwebサービス](https://qiita.com/Taro_man/items/fb3c941bc77fbcdca7ce)

それでは 2022 年も良い Django ライフを！