[Python]DjangoでAPIを実装してDBとの連携を試してみる
前回の続き
前回データベースの設計の変更はDjangoではmigrateを実行することで、実際にローカルでのPostgreのデータベースへ変更内容が反映されることが分かりました。せっかくなのでAPIを実装してDBとの連携を見てみましょう。
現在のテーブルの状況
現在は前回の続きのためbooksというアプリだけ作成されています。
そのbooksアプリで作成したテーブルbooks_bookはid、title、publidhed_dataの3つのカラムで構成されています。
このテーブルを活かしてなんか処理を行うAPIを実装したいな。。🤔
APIを作ってみる
ということでここで一つDBと連携するAPIを実装してみます。
booksアプリに新しくurls.pyを作成してそこに以下を追記します。
from django.urls import path
from . import views
urlpatterns = [
path('api/get-title/', views.get_title, name='get_title'),
]
これでbooksアプリでのAPIのエンドポイントを作成できました。
つまり、ここにアクセスすると○○の機能が走るよみたいな入口ができました。
ここでの○○の機能とはviewsファイルのget_title関数です。
ということで次に実際に処理を行う処理関数をviews.pyというファイルに記載します。
from django.http import JsonResponse
from django.shortcuts import render
from .models import Book
def get_title(request):
# リクエストがGETであることを確認
if request.method == 'GET':
# クエリパラメータから 'title' を取得
title = request.GET.get('title', None)
# 'title' が提供されているか確認
if not title:
return JsonResponse({'error': 'Title parameter is required.'}, status=400)
# データベースでタイトルを検索
try:
book = Book.objects.get(title=title)
return JsonResponse({'title': book.title}, status=200)
except Book.DoesNotExist:
return JsonResponse({'error': 'Book with the given title does not exist.'}, status=404)
# GET以外のリクエストはエラーを返す
return JsonResponse({'error': 'Invalid request method.'}, status=405)
これは何をしているかというと
シンプルにユーザーが本のタイトル例えばハリーポッターと入力して
それがデータベースにあればその本のタイトルを返して、
データベースにない場合はエラーを起こす処理です。
-GET以外のメソッドでアクセスしてきた場合
-本のタイトルを入れてきてない場合
上記の場合はこの関数はぶちぎれてエラーを起こすはずです。
仕上げにプロジェクトのurls.pyの方にもurlpatternsとしてbooks.urlを追加します。
urlpatterns = [
path("admin/", admin.site.urls),
path('', include('books.urls')),
]
こうすることで超シンプルなAPIが実装されました。
これでAPIのエンドポイントとして以下のURLの場所に先ほどの
get-titleの処理関数が走るような設定ができました。
http://localhost:8000/api/get-title/
実際に試してみる
ということで実際にこのAPIが上手いこといくか試してみます。
まずテーブルにハリーポッターのタイトルを追加しておきます。
INSERT INTO books_book (title, published_date)
VALUES ('Harrypotter', '2025-09-26');
これでAPIを試せるはず!
サーバーを立ち上げて実験します。
コマンドは以下です。
これで開発サーバーが立ち上がります。
python manage.py runserver
そうすると最初はこうなります🐶
というのも自分達が処理を用意している場所はプロジェクトのurls.pyで記載している
admin/
api/get-title/ [name='get_title']
この場所だからですね。
それでは以下の場所に対してリクエスト?title=Harrypotterを付け加えてアクセスしてみましょう。
http://localhost:8000/api/get-title/
これにハリーポッターを付け加えてアクセスしてみると..
http://localhost:8000/api/get-title/?title=Harrypotter
ちゃんとレスポンスして返ってくる。
本のタイトル入れずに行うと、、ちゃんと怒られる。
まとめ
今回は簡単にAPIを実装してDBとの連携を確認できました。
APIのロジック部分であるviews.pyにある
この部分
book = Book.objects.get(title=title)
ここで内部的には本のタイトルを取得するSQL文が実行されて、DBの値を取得してきていました。
これで色々な処理を行うことができることが分かりました。
Discussion