Django REST framework でJSONをコンソール画面からGET/POST/PUT/DELETE



前回の記事↓
[Djangoでjsonを扱うRESTfulなAPIを作る - Qiita](https://qiita.com/HIJIKI/items/c4f17137ef465f7034bb)

##  Django REST framework の追加
djangoのrest frameworkをインストールします

```
$ pip install djangorestframework
```

`setting.py`内の INSTALLED_APPという項目にrest_frameworkを追加します

```python:setting.py
.....

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
+   'rest_framework'  #追加行
]

.....
```

##  シリアライザーの作成
シリアライズとは、複数の並列データを直列化して送信することを意味します

シリアライザーファイルをmyapp内に作成します

```
$ touch myapp/serializers.py
```
中身を編集します

```serializers.py
from rest_framework import serializers
from myapp.models import Book, Author

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
```


##  apiの作成
```
$ touch myapp/apis.py
```

```apis.py
from rest_framework import viewsets, routers
from myapp.models import Book
from myapp.serializers import BookSerializer

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

router = routers.DefaultRouter()
router.register(r'books', BookViewSet)
```

urls.pyを以下のように編集することでapiのエンドポイントを記述します

```uris.py
from django.conf.urls import url,include
from django.contrib import admin
from myapp import apis

urlpatterns = [
    url(r'^api/', include(apis.router.urls)),
]
```

プラウザで http://localhost:8000/api にアクセスします

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185108/949d48c9-8d02-c110-473e-10d465a3c814.png)


apiのルートコンソール画面が表示されました  


今度は http://localhost:8000/api/books にアクセスしてみましょう
`Creating a ModelSerializer without either the 'fields' attribute or the 'exclude' attribute has been deprecated since 3.3.0, and is now disallowed. Add an explicit fields = '__all__' to the BookSerializer serializer.`
というエラーが返されるはずです

これはrest_framework3.3.0以降でModelSerializerにfields属性やexclude属性を追加していないために発生します
[Serializers - Django REST framework](https://www.django-rest-framework.org/api-guide/serializers/)
> You can also set the fields attribute to the special value '\_\_all__' to indicate that all fields in the model should be used.

今回はfieldsを特に制限するつもりはないので、serializers.pyを以下のように編集します

```serializers.py
from rest_framework import serializers
from myapp.models import Book, Author

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
+       fields='__all__'  #追加行

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
+       fields='__all__'  #追加行

```


http://localhost:8000/api/books に再アクセスしてみます

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185108/d54c5e74-4c32-acff-7c52-008de18925dd.png)


この画面が出れば成功です

##  コンソール画面からのPOST

`curl`コマンドやクライアントサイドからPOSTできますが、このコンソール画面からも可能です

content:の欄にpostしたいデータを入力して右下のpostボタンを押します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185108/85d03e25-f61a-d05c-e490-87dd5d726a6d.png)


３つ本を追加してみました

##  コンソール画面からのPUT
putしたいデータのid番号にアクセスします
今回はid2を編集したいのでアドレスは http://localhost:8000/api/books/2/ となります

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185108/e64c27aa-e8b8-8e48-9744-acdcd3881dd6.png)


postと同じようにフォームに入力します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185108/200f2e11-637b-6a8a-8623-bedb7e6716f3.png)


変更できているか確認します http://localhost:8000/api/books/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185108/2836cdc3-fb80-8807-abaa-9fbf02d2521d.png)


無事(?)おじいさんが生まれました

##  コンソール画面からのDELETE
putのときと同じ画面の赤いボタンを押すと、特定のidのデータを削除することができます

次回の記事↓
[axios & Django REST framework でJSONをGET/POST - Qiita](https://qiita.com/HIJIKI/items/ed4badee7ef37e30b957)