🫠

[Python]DjangoでAPIを実装してDBとの連携を試してみる

に公開

前回の続き
https://zenn.dev/ai_tech/articles/68b2923036b08d
前回データベースの設計の変更は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