🐍

Djangoのget_object_or_404について

2021/05/04に公開

Django を使ってWeb開発をしていると get_object_or_404 に度々出会うことがある。

Djangoの公式ドキュメントには以下のように記載されている。

get() を実行し、オブジェクトが存在しない場合には Http404 を送出することは非常によく使われるイディオムです。 Django はこのためのショートカットを提供しています。

仮に以下のような特定の書籍の感想を編集する機能があったとして、book_id をもとに特定の書籍を探す場合に探し出すが、該当の書籍がなかった場合は404pageを表示するという処理になる

def impression_edit(request, book_id, impression_id=None):
    """感想の編集"""
    #親となる書籍(=Bookモデル)をbook_idから探し、なければ404を出す
    book = get_object_or_404(Book, pk=book_id)
    if impression_id:
        #親となる感想(=Impressionモデル)をimpression_idから探し、なければ404を出す
        impression = get_object_or_404(Impression, pk=impression_id)
    else:
        impression=Impression()
	
    return render(
        request, 
        'cms/impresison_edit.html',
        dict(
            form=form,
            book_id=book_id,
            impression_id=impression_id
        )
    )

func:~django.shortcuts.get_object_or_404 関数は、Django モデルを第一引数に、任意の数のキーワード引数を取り、モデルのマネージャの get() 関数に渡します。オブジェクトが存在しない場合は Http404 を発生させます。

なぜ、ここで404のページが表示されるのかについては get_object_or_404 がなぜ404ページを送信できるのか、調べてみた(Django) が参考になったのでリンクを上げておく。

また似たような処理で get_list_or_404() もあり、利用用途としては get_object_or_404 とほぼ同じだが、対象のobjectが配列でかつEmptyだった場合に返す処理のよう。

get_list_or_404() という関数もあります。この関数は get_object_or_404() と同じように動きますが、 get() ではなく、 filter() を使います。リストが空の場合は Http404 を送出します。

Discussion