0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

django-rest-framework の設定

Last updated at Posted at 2023-11-29

とりあえずAPIを使えるようにする

初期設定

必要なライブラリのインストール

pip3 install django
pip3 install djangorestframework
pip3 install django-filter

プロジェクト作成とアプリ作成

django-admin startproject portfolio
cd portfolio
python3 manage.py startapp djangorest
tree
├── db.sqlite3
├── djangorest
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
└─ manage.py

モデルの定義

  • ForeignKeyは「多対一」の関連を持つモデル同士を関連付け
  • related_nameは、逆参照(reverse lookup)を行うときに、関連するオブジェクトを取得するための属性名を指定
  • toはmodelを指定する(省略可能)
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=32)
    mail = models.EmailField()

class Category(models.Model):
    name = models.CharField(max_length=32)

class Entry(models.Model):
    STATUS_DRAFT = "draft"
    STATUS_PUBLIC = "public"
    STATUS_SET = (
            (STATUS_DRAFT, "下書き"),
            (STATUS_PUBLIC, "公開中"),
    )
    title = models.CharField(max_length=128)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    status = models.CharField(choices=STATUS_SET, default=STATUS_DRAFT, max_length=8)
    author = models.ForeignKey(to=User, related_name='entries', on_delete=models.CASCADE)
    category = models.ForeignKey(to=Category, related_name='categorys', on_delete=models.CASCADE)

作成したアプリをsetting.pyへ追加

vim portfolio_app/settings.py

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'djangorest'
]

modelをDBへ反映

manage.pyのあるディレクトリで下記を実行

  • migrationファイルを作る
    python3 manage.py makemigrations
  • migrationファイルを元にDBに反映する
    python3 manage.py migrate

管理画面へ反映させる

下記にmodel情報を追記
vim portfolio/djangorest/admin.py

from django.contrib import admin
from djangorest.models import User , Category , Entry

admin.site.register(User)
admin.site.register(Category)
admin.site.register(Entry)
# Register your models here.

反映されているか確認

python3 manage.py runserver
image.png

REST Frameworkをdjangoへ読み込ませる

vim portfolio_app/settings.py

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'djangorest',
    'rest_framework',
]

serializerの作成

vim djangorest/serializer.py

from rest_framework import serializers
from .models import User, Entry, Category


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('name', 'mail')


class EntrySerializer(serializers.ModelSerializer):
    class Meta:
        model = Entry
        fields = ('title', 'body', 'created_at', 'status', 'author', 'category')


class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ('name')

viewsの設定

vim djangorest/views.py

from django.shortcuts import render

import django_filters
from rest_framework import viewsets, filters

from .models import User, Entry
from .serializer import UserSerializer, EntrySerializer, CategorySerializer


class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class EntryViewSet(viewsets.ModelViewSet):
    queryset = Entry.objects.all()
    serializer_class = EntrySerializer

class CategoryViewSet(viewsets.ModelViewSet):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer

urls.pyの編集

portfolio_app/urls.pyにportfolio_app/djangorest/urls.pyを読み込む設定を追加
vim portfolio_app/urls.py

from django.contrib import admin
from django.urls import path , include

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

vim djangorest/urls.py

from rest_framework import routers
from .views import UserViewSet, EntryViewSet, CategoryViewSet


router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
router.register(r'entries', EntryViewSet)
router.register(r'categorys', CategoryViewSet)

動作確認

python3 manage.py runserver
http://localhost:8000/api/ にアクセスして下記が表示されればOK
image.png

  • pythonからGETで取得
import requests
import json

url = 'http://localhost:8000/api/users/'
res = requests.get(url)
data = json.loads(res.text)
print(data)

image.png

  • pythonからPOSTで登録
import requests
import json

url = 'http://localhost:8000/api/users/'
payload = {
        "name": "barfoo",
        "mail": "hoge3@gmail.com"
    }
res = requests.post(url,json=payload)
data = json.loads(res.text)
print(data)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?