削除したいモデルのデータがない場合、エラーとして処理すべきパターンと、何もしなくて良いパターンがあります。
選んだ仕様に応じて設計やコーディングが変わってきます。
今回は削除したいモデルのデータがない場合の対処法について解説します。
データを削除する
削除したいデータが存在しないという事は、既に削除済みであるとも考えられます。
“既に目的が果たされているので問題ない”とするか、“データが存在しなかったことをユーザーに伝える必要がある”とするかで対処法が変わります。
これはどちらの対処法が効率が良いか?という問題ではなく、仕様の問題になります。
仕様が決まっていない場合は、”削除したいデータがない場合の仕様”を決め、それに応じて適切な設計をします。
以降ではユーザーを削除する例を使って解説します。
削除したいユーザーが存在しない時、問題が発生したとする場合
ビュー関数のユーザーを削除する処理は以下の様になります。
# (略)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メソッドで例外は発生しません。
この実装なら削除対象のユーザーの有無に関わらず同じロジックで処理できます。個人的にはこの手法の方がおすすめです。
経験のある開発者であれば、特にコメントがなくてもコードの意図が伝わりやすいと思います。
コメントを残す