2日前にpythonに初めて触れたド素人がDjango REST Frameworkでめっちゃエロいサービスを瞬殺で作る

# 経緯
とりあえず、DjangoでRESTful APIサーバの作り方を知りたかっただけ。
後悔はしていない。

# 今回作ったもの
[【github】gaku3601/django_mechaerotic](https://github.com/gaku3601/django_mechaerotic)
ここに置いときます。

# 早速男のロマン作ってく
pipで以下を追加しておく。
djangorestframework : RESTful APIサーバがDjangoで作れるようになるもの
django-filter : 入れると検索周りがいい感じに書けるらしい

```bash:コマンド
$ pip install djangorestframework
$ pip install django-filter 
```
いつもどおり、PJとappを作成する。

```bash:コマンド
$ django-admin startproject project .
$ python manage.py startapp erotic
```

いつもどおり、作成したappをsetting.pyに記述する。
また、djangorestframeworkとdjango-filterを使用する場合、同じく宣言しなければいけないので追記しておく。

```py:project/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'erotic', #追記
    'rest_framework', #追記
    'django_filters', #追記
]
```

ここまで来たら、早速モデル定義をしていきます。
今回はセクシー女優モデルと、このモデルと紐づくvideo情報モデルを一対多の関係で作ってみたいと思います。

```py:erotic/models.py
from django.db import models

# Create your models here.
class SexyActress(models.Model):
    name = models.CharField(max_length=20, unique=True)
    memo = models.TextField()

    """
    管理画面上で表示させる項目を設定する
    """
    def __str__(self):
        return self.name

class Video(models.Model):
    title = models.CharField(max_length=50, unique=True)
    sexyActress = models.ForeignKey(SexyActress, related_name='videos', on_delete=models.CASCADE)
    url = models.CharField(max_length=300)
    memo = models.TextField()

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

作成したモデルを管理画面で確認・編集したいので、admin.pyを以下のように編集します。

```py:erotic/admin.py
from django.contrib import admin
from .models import SexyActress, Video

@admin.register(SexyActress)
class SexyActress(admin.ModelAdmin):
    pass

@admin.register(Video)
class Video(admin.ModelAdmin):
    pass
```

migrationファイルを作成、適用します。

```bash:コマンド
$ python manage.py makemigrations
$ python manage.py migrate
```

一旦この状態を管理画面で確認します。
スーパユーザを作成・システムの起動を実施し、[http://localhost:8000/admin/](http://localhost:8000/admin/)にアクセスします。

```bash:コマンド
$ python manage.py createsuperuser
$ python manage.py runserver
```
![スクリーンショット 2019-02-21 13.07.34.png](https://qiita-image-store.s3.amazonaws.com/0/47132/21b26624-5bc2-fff7-3e6b-5265715393d0.png)

🎉作成したモデルが表示、編集できるようになりました(´・ω・｀)b🎉
適当にデータ格納しときます。

![スクリーンショット 2019-02-21 13.12.13.png](https://qiita-image-store.s3.amazonaws.com/0/47132/81680db9-4112-c3aa-3cae-a3d3d2f560f0.png)

![スクリーンショット 2019-02-21 13.12.24.png](https://qiita-image-store.s3.amazonaws.com/0/47132/6d2b0484-13dd-b234-b842-349992771c7e.png)

# Django REST FrameworkでAPIを実装していく
Django REST FrameworkではSerializerなるものを作らないといけないらしいので実装していく。
ちなみにSerializerというのはAPIサーバではJson→Pythonモデル、Pythonモデル→Jsonみたいな変換処理が必要になってくるのですが、それを行うものとのことです。

```py:erotic/serializer.py
from rest_framework import serializers

from .models import SexyActress, Video


class SexyActressSerializer(serializers.ModelSerializer):
    class Meta:
        model = SexyActress
        fields = ('name', 'memo')


class VideoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Video
        fields = ('title', 'sexyActress', 'url', 'memo')
```

続きましてViewsをいじっていきます。

```py:erotic/views.py
import django_filters
from rest_framework import viewsets, filters

from .models import SexyActress, Video
from .serializer import SexyActressSerializer, VideoSerializer


class SexyActressViewSet(viewsets.ModelViewSet):
    queryset = SexyActress.objects.all()
    serializer_class = SexyActressSerializer


class VideoViewSet(viewsets.ModelViewSet):
    queryset = Video.objects.all()
    serializer_class = VideoSerializer
```

ルーティングの設定を行うため、projectとappの両方のurls.pyを以下のように編集します。

```py:project/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('erotic.urls')),
]
```

```py:erotic/urls.py
from rest_framework import routers
from .views import SexyActressViewSet, VideoViewSet
from django.urls import path, include

router = routers.DefaultRouter()
router.register(r'sexy-actress', SexyActressViewSet)
router.register(r'video', VideoViewSet)

urlpatterns = [
    path('', include(router.urls)),
]
```

これでサーバを起動し、ブラウザでhttp://localhost:8000/api/にアクセスしてみる。

```bash:コマンド
$ python manage.py runserver
```
![スクリーンショット 2019-02-21 16.22.56.png](https://qiita-image-store.s3.amazonaws.com/0/47132/a8d2404b-f4db-9e3d-d683-855dd3a98897.png)
![スクリーンショット 2019-02-21 16.23.23.png](https://qiita-image-store.s3.amazonaws.com/0/47132/2819dc79-43a2-381c-947e-bc4509264da7.png)

こんな感じで、【一覧表示(GET)】【単表表示(GET)】【削除(DELETE)】【更新(PUT)】【作成(POST)】の一連のRESTful APIに必要な機能が瞬殺で作成できる。

# おわりに
🎉めっちゃエロいサービスが瞬殺で作成できました🎉
一撃性が強いので、瞬殺でサービスを立ち上げたい場合において、ポテンシャルを半端なく感じました。
覚えることはいろいろありますが、覚えちゃえば早い！これがフルスタックフレームワーク(´・ω・｀)

# 参考にさせていただいた文献
[Django REST Frameworkを使って爆速でAPIを実装する](https://qiita.com/kimihiro_n/items/86e0a9e619720e57ecd8)