【Django】RestFrameworkで超絶簡単にAPIサーバを構築する。

# はじめに
業務でAPIのシミュレータを行うためAPIをサーバを構築することになりました。
初歩的なことですが備忘録として残そうと思います。

同じように進めていただければ実装できると思います。

なお、Djangoにおける最低限の知識は持っている前提で記載します。
わからない箇所がありましたら、調べていただけると幸いです。

## APIサーバ構築

では、早速APIサーバの構築を行います。
仮想環境（venv）で構築していないので、
仮想環境で作業したい方はそちらで行なってください。

###必要なパッケージのインストール

まずは必要なものをインストールしていきます。
ターミナルで以下のコマンドを実行します。

```
$ pip3 install django djnagorestframework
```

###プロジェクト作成

プロジェクトを作成します。
ターミナルで以下のコマンドを実行します。

```
$ django-admin startproject <プロジェクト名>
```

###アプリ作成

プロジェクト内で使用するアプリを作成します。
ターミナルで以下のコマンドを実行します。

```
$ cd <プロジェクト名>
$ ls
<プロジェクト名のフォルダ>    manage.py
$ python3 manage.py <アプリ名>
```

###マイグレーション

マイグレーションを行います。
ターミナルで以下のコマンドを実行します。

```
$ python3 manage.py migrate
```

###settings.pyの修正

settings.pyに必要な修正を加えていきます。

```python:settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',    ### 追加
    '<アプリ名>',    ### 追加
]

LANGUAGE_CODE = 'ja'    ### 修正(任意)

TIME_ZONE = 'Asia/Tokyo'    ### 修正(任意)
```

### urls.pyの修正（プロジェクトフォルダ配下）

次にurls.pyを修正します。
今回修正するurls.pyですが、プロジェクトと同じ名前のフォルダ配下に、
デフォルトで作成されているurls.pyを修正します。

`path('api/',~~~)`の`api/`は、各自好きなパスに変更してください。

```python:urls.py
from django.contrib import admin
from django.urls import path, include    ### 追加

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('<アプリ名>.urls')),    ### 追加
]
```

### urls.pyの作成＆修正（アプリフォルダ配下）

またurls.pyの修正をするわけですが、
今回はアプリフォルダの配下にurls.pyファイルを新規作成し、
そちらに記述していきます。

`views.BookAPI`は、後ほど作成します。

```python:アプリ名/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('book/', views.BookAPI.as_view()),
]
```

### models.pyの修正

アプリフォルダ配下にある、models.pyの修正を行います。
今回は、Bookモデルを作成し、フィールドをタイトルと著者にしたいと思います。

```python:models.py
from django.db import models


class Book(models.Model):
    title = models.CharField('タイトル', max_length=30)
    author = models.CharField('著者', max_length=30)

    def __str__(self):
        return self.title
```

###views.pyの修正

次にviews.pyの修正を行います。
`BookSerializers`は後ほど作成します。

`serializer_class`と`queryset`は、必須です。
serializer_classは、DBのデータをjson形式に変換するために必要な定義で、
querysetは、返す値を指定します。

```python:views.py
from rest_framework.generics import ListCreateAPIView
from .models import Book
from .serializers import BookSerializers

class BookAPI(ListCreateAPIView):
    serializer_class = BookSerializers
    queryset = Book.objects.all()
```

### serializers.pyの修正

アプリフォルダ配下に`serializers.py`を作成します。

先ほども記載しましたが、serializers.pyは、
DBのデータをjson形式に変換する役割を担っているらしいです。

fieldsでは、GETまたはPOSTすることができるフィールドを指定します。

```python:serializers.py
from django.db.models import fields
from rest_framework import serializers
from .models import Book

class BookSerializers(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['title', 'author']
```

### admin.pyの修正
admin.pyの修正も行います。
初期状態では、DBにデータが格納されていないため、自らデータを作るか、
POSTでデータを格納する必要があります。

管理画面からデータを作成する際に、見やすいようにしておきます。


```python:admin.py
from django.contrib import admin
from .models import Book

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    model = Book
    list_display = ['title', 'author']
```

### マイグレーション

一通り必要な修正は終了したので、models.pyの内容を、
データベースに反映させたりします。

ターミナルで以下のコマンドを実行します。

```
$ python3 manage.py makemigrations
$ python3 manage.py migrate
```

### 管理者ユーザの作成

管理者ユーザを作成します。
メールアドレスは入力しないでenterで大丈夫です。

```
$ python3 manage.py createsuperuser
```

### 起動

ターミナルで以下のコマンドを実行し、開発環境を起動します。

```
$ python3 manage.py runserver
```

### アクセス
ブラウザより、以下にアクセスできることを確認してみてください。

■ 管理画面
・http://127.0.0.1:8000/admin/

■　Bookのデータが返される画面（データをPOSTすることもできます。）
・http://127.0.0.1:8000/api/book/

#さいごに
今回は、開発環境のみの実装になりましたが、
実際にデプロイして本番環境のように扱うまでの手順も記事にしようと考えています。

ぜひそちらもご覧ください。

以上、最後までご覧いただきありがとうございました。