Django モデルのデータを削除する時、データがない場合の対処法

削除したいモデルのデータがない場合、エラーとして処理すべきパターンと、何もしなくて良いパターンがあります。

選んだ仕様に応じて設計やコーディングが変わってきます。

今回は削除したいモデルのデータがない場合の対処法について解説します。

データを削除する

削除したいデータが存在しないという事は、既に削除済みであるとも考えられます。

“既に目的が果たされているので問題ない”とするか、“データが存在しなかったことをユーザーに伝える必要がある”とするかで対処法が変わります。

これはどちらの対処法が効率が良いか?という問題ではなく、仕様の問題になります。

仕様が決まっていない場合は、”削除したいデータがない場合の仕様”を決め、それに応じて適切な設計をします。

以降ではユーザーを削除する例を使って解説します。

削除したいユーザーが存在しない時、問題が発生したとする場合

ビュー関数のユーザーを削除する処理は以下の様になります。

# (略)contextの初期化やidの設定など

try:
    User.objects.get(id=id).delete()
except User.DoesNotExist:
    raise Http404("指定したユーザーは存在しませんでした。")

return render(request, 'accounts/user_list.html' ,context)

ユーザーが存在する場合は、ユーザーを削除しuser_list.htmlを表示しますが、

ユーザーが存在しない場合は、DoesNotExist例外が発生します。ステータスコードを404にして、”指定したユーザーは存在しませんでした。”というメッセージを表示します。

他にもステータスコードは200にして、context[‘warning_msg’]=’指定したユーザーは存在しませんでした。’というメッセージを追加する方法も考えられます。

削除したいユーザーが存在しなくても問題ないとする場合

削除したいユーザーが存在しなくても、存在している時と同じ様に処理します。

# (略)contextの初期化やidの設定など

user = User.objects.filter(id=id).delete()
return render(request, 'accounts/user_list.html' ,context)

filterメソッドを使うと指定したidのユーザーが存在しなくても、deleteメソッドで例外は発生しません。

この実装なら削除対象のユーザーの有無に関わらず同じロジックで処理できます。個人的にはこの手法の方がおすすめです。

経験のある開発者であれば、特にコメントがなくてもコードの意図が伝わりやすいと思います。

スポンサーリンク
スポンサーリンク