【Django】views.py:get_object_or_404、get_list_or_404の使用方法

時計 2021.06.18 / 時計

【Django】views.py:get_object_or_404、get_list_or_404の使用方法

本記事ではDjangoのviews.pyで使用する、get_object_or_404get_list_or_404の使用方法について解説していきます。

これらはモデル(データベース)から指定した対象のレコード(オブジェクト)を取得するために使われます。

記述を短くするためにDjangoで用意されているdjango. shortcutsに含まれているget_object_of_404とget_list_or_404の使い方を見ていきましょう。

get_object_or_404

get_object_or_404は、django.shortcutsに用意されているショートカット関数です。
これはモデルから指定した対象のレコードを1件取得することができます。

get_object_or_404を使うためには、プログラムの先頭で次のようにdjango.shortcutsからインポートする必要があります。

from django.shortcuts import get_object_or_404

get_object_or_404の使用例を以下に記します。

from django.shortcuts import get_object_or_404, render

def book(request, book_id):
    book = get_object_or_404(Book, pk=book_id)
    return render(request, 'book/book-detail.html', {'book': book})

ここではBookモデルからpk=book_idのレコードを取得し、book変数に格納しています。
book_idはテンプレートから送信されたデータです。

このようにget_object_or_404の第1引数にはモデル、第2引数以降はアクセスしたい(検索したい)レコードの情報(キー)を指定します。
複数条件でレコードの絞り込み(検索)も可能です。

book = get_object_or_404(Book, pk=book_id, name=’office’)

またget_object_or_404を使って存在しないレコードにアクセスした場合、404エラーを返します。
クライアント側には、次図のようにPage not found(404)ページが表示されます。

Page not found(404)ページ

そのため上記で記載したget_object_or_404の使用例は以下のように記述することができます。

from django.http import Http404

def book(request, book_id):
    try:
        book = Book.objects.get(pk=book_id)
    except Book.DoesNotExist:
        raise Http404("404 Error")
    return render(request, 'book/book-detail.html', {'book': book})

本来は上記のように記載すべきところを、短く記述できるようにしたのがショートカット関数のget_object_or_404です。
django.shortcutsのショートカットは、短い記述で多くの機能を含んでいます。

get_object_or_404の機能をまとめると次のようになります。

  • モデルから指定した対象のレコードを1件取得する
  • アクセスしたレコードが存在しなかった場合、404エラーを返す

get_list_or_404

同じカラム値を持つレコードが複数ある場合、get_list_or_404()を使用します。
get_object_or_404では1件しかオブジェクトを取得できないので、複数のオブジェクト(レコード)を取得する場合は、get_list_or_404を使います。

取得した複数のレコードはリストで保存されます。

get_list_or_404の使用例を以下に記します。

from django.shortcuts import get_list_or_404

def book(request, category):
    books = get_list_or_404(Book, category=category)
    return render(request, 'book/book-detail.html', {'books': books})

使い方はget_object_or_404と同じです。

get_object_or_404の機能をまとめると次のようになります。

  • モデルから指定したキーのレコードをすべてリストとして取得する
  • アクセスしたレコードが存在しなかった場合、404エラーを返す

404エラーとは

すでに解説しているように、get_object_or_404とget_list_or_404は、アクセスしたレコードが存在しなかった場合に404エラーを返します。

ではこの404エラーとは何なのか。

404エラーとはユーザーにリンク先(アクセス先)が存在しないことを知らせるためのエラーページです。

404はHTTPステータスコードと呼ばれます。
HTTPステータスコードによって、エラーの内容がわかるようになっています。

まとめ

本記事「【Django】views.py:get_object_of_404、get_list_or_404の使用方法」はいかがでしたか。

djangoを勉強し始めの方でもget_object_or_404やget_list_or_404を見たことがある、使ったことがあるという人は多いと思います。

それほどよく使う関数です。しかし詳しくその意味を知っている人は少ないです。

本記事を通して、これら関数の使い方を理解して、今後のWebアプリケーション開発に活かしてください。