[Django][RESTframework] 추가, 업데이트 및 검색을 위한 간단한 동적 API 만들기 비망록

사전 쓰기



굉장히 돌아다니면서 어떻게든 작성할 수 있던 API에 대해서 비망록을 남긴다.

이번에 만든 API는 다음과 같습니다.
# ユーザーの登録
http://127.0.0.1:8000/v1/user/

# pk=1 のユーザー情報を更新   
http://127.0.0.1:8000/v1/user/1/

# pk=2 のユーザー情報を取得
http://127.0.0.1:8000/v1/user/2/affinity

준비



프로젝트 이름: project
앱 이름 : api

구성


└─project
   ├─api
   │ ├─migrations
   │ │ └─..
   │ ├─__init__.py
   │ ├─apps.py
   │ ├─models.py
   │ ├─serializer.py
   │ ├─urls.py
   │ └─views.py
   ├─project
   │ ├─__init__.py
   │ ├─asgi.py
   │ ├─settings.py
   │ ├─urls.py
   │ └─wsgi.py
   ├─db.sqlite3
   └─manage.py

프로젝트 만들기


$ django-admin startproject project 
$ cd project
$ python manage.py startapp api

$ brew install mysql
$ pip install pymysql
$ pip install djangorestframework
$ pip install django-filter

$ mysql.server start 
# mysql.server stop でサーバー停止

#MySQLに入る
$ mysql -u root

MySQL 작업
mysql> show databases;
mysql> create database sample;
mysql> show databases;
mysql> exit

마나게. py



manage.py
import pymysql #追加
pymysql.install_as_MySQLdb() #追加
$ python manage.py migrate

$ mysql -u root

mysql> use sample;
mysql> show tables;
mysql> exit

눈가리 gs. py



settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'api',            #追加
    'rest_framework', #追加
    'django_filters', #追加
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'sample',  # 作成したデータベース名
        'USER': 'root',  # ログインユーザー名
        'HOST': '',
        'PORT': '',
    }
}

# ペジネーション
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 5
}


LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

조류에서 ls. py



먼저 모델 만들기
데이터베이스에 저장할 내용 설명

models.py
from django.db import models

"""
CharField (文字列が入る)文字数制限必要
TextField(文章が入る)
ImageField(写真ファイルが入る)
FileField(不特定のファイルが入る)
IntegerField(数値が入る)オーバーフロー注意
BooleanField(True/False)が入る *いわゆるフラッグ
DateField(日付が入る)
DateTimeField(日時が入る)
ForeignKey(外部キー) *一対多のリレーションになる。(言葉だけでも覚えておきましょう!)
ManyToManyField(複数の外部キーが入る) *多対多のリレーションになる
OneToOneField(外部キー) *一対一のリレーションになる
"""
class BaseAPI(models.Model):

    first_name = models.CharField(max_length=32)
    last_name = models.CharField(max_length=32)

    class Meta:
        verbose_name_plural = "ベースAPI"

세리아 ぃぜ r. py



모델에 데이터를 적절한 형태로 입력, 출력하는 것
-[참고 사이트 6]

serializer.py
# coding: utf-8
from .models import BaseAPI
from rest_framework import serializers

class BaseAPISerializer(serializers.ModelSerializer):

    class Meta:
        model = BaseAPI
        fields = (
            'first_name',
            'last_name'
        )

비에ws. py



View 설정은 여기 참조


수업
조작


CreateAPIView
등록(POST)

ListAPIView
일람 취득(GET)

RetrieveAPIView
획득(GET)

UpdateAPIView
업데이트(PUT, PATCH)

DestroyAPIView
삭제(DELETE)


-[참고 사이트 3]

views.py
# coding: utf-8
from .models import BaseAPI
from .serializer import BaseAPISerializer
from rest_framework import generics


class BaseAPIViewSet_POST(generics.CreateAPIView):
    queryset = BaseAPI.objects.all()
    serializer_class = BaseAPISerializer


class BaseAPIViewSet_PUT(generics.UpdateAPIView):
    queryset = BaseAPI.objects.all()
    serializer_class = BaseAPISerializer


class BaseAPIViewSet_GET(generics.RetrieveAPIView):
    queryset = BaseAPI.objects.all()
    serializer_class = BaseAPISerializer

project/urls.py



v1은 관습에서 API의 버전을 나타내는 것 같은 Ver 1.0.1과 같은

urls.py
"""プロジェクト名 URL Configuration

'urlpatterns'リストはURLをビューにルーティングします。
詳細は以下を参照してください。
https://docs.djangoproject.com/en/3.1/topics/http/urls/
例を紹介します。
関数ビュー
    1. インポートの追加: from アプリ名 import views
    2. urlpatternsにURLを追加する: path('', views.home, name='home')
クラスベースのビュー
    1. インポートの追加: from 他のアプリ名.views import Home
    2. urlpatternsにURLを追加する: path('', Home.as_view(), name='home')
別の URLconf を含む
    1. include() 関数をインポートします: from django.urls import include, path
    2. urlpatternsにURLを追加する: path('blog/', include('blog.urls')
"""

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

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

api/urls.py



동적 라우팅을 원한다면
< str : pk >로 작성하십시오.

app/urls.py
# coding: utf-8
from django.urls import path
from .views import BaseAPIViewSet_POST, BaseAPIViewSet_PUT, BaseAPIViewSet_GET

app_name = 'api'
urlpatterns = [
    path('user/', BaseAPIViewSet_POST.as_view(), name='POST'),
    path('user/<str:pk>/', BaseAPIViewSet_PUT.as_view(), name='PUT'),
    path('user/<str:pk>/affinity', BaseAPIViewSet_GET.as_view(), name='GET'),
]
$ python manage.py runserver 
# ユーザーの登録
http://127.0.0.1:8000/v1/user/


# pk=1 のユーザー情報を更新 
# (存在しないpkを指定するとサイトにアクセスできないと表示される)
http://127.0.0.1:8000/v1/user/1/

# pk=2 のユーザー情報を取得
# (存在しないpkを指定するとサイトにアクセスできないと表示される)
http://127.0.0.1:8000/v1/user/2/affinity

이것으로 완성

URL의 pk를 얻고 싶다면
이 기사
작성 방법 참조

참고 사이트



1, Django REST Framework 사용법 노트
2, Django REST Framework를 사용하여 폭속으로 API 구현
3, DRF의 General view 사용법
4, Django REST framework 사용자 정의 방법 - 자습서 보충
5, Django 개발자를 위한 길① ~ Models 이해 ~
6, Django REST framework에서 배운 것을 정리해 보았습니다.

좋은 웹페이지 즐겨찾기