Django REST frameworkで入力されたrequest.dataをバリデーションして、400レスポンスを返す楽な書き方

2022年5月25日Djangoの豆知識DRF

知っている人にとっては当然のことかもしれませんが、最近気づいたtipsです。

Django REST framework(以下DRF)で、入力されたJSONをデシリアライズ, is_valid()して、不適なJSONのときは400 Bad Requestを返すとき、こう書いていませんか?

class YourHandler(APIView):
    post(self, request):
        serializer = YourSerializer(request.data)
        if serializer.is_valid():
            # JSON入力がいい時の処理
            return Response("OK")
        else:
            # JSON入力がvalidでないとき
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

私も今までこう書いていました。これでも動くしカスタマイズできていいのですが、if文で多少コードが見にくくなります。

DRFはこのよくあるニーズを解決してくれます。

class YourHandler(APIView):
    post(self, request):
        serializer = YourSerializer(request.data)
        serializer.is_valid(raise_exception=True)
        # JSON入力がいい時の処理
        return Response("OK")

この4行目に注目すると、serializer.is_valid()にraise_exception=Trueがついています。

このraise_exception=Trueが肝で、これを入れることで、バリデーションをして400のResponseをreturnするということを裏でやってくれるのです。

リーダブルコードでいうところの「ガード節とアーリーリターン」にあたりますね。

以上最近のtipsでした。