[初学者向け]Django Rest FrameworkでPOSTリクエストを送信した時、Cannot be null と出たときの至極些細なミス


はじめに

私は現在、フロントエンドをReactで、バックエンドをDjangoで成果物を作成しています。
API通信を行い、POSTリクエストを送信する際に、すごくしょうもないですが、初学者ならやってしまいそうなミスに遭遇したので、自分の戒めと、同様のエラーに遭遇した人への情報共有のために記事に残しておこうと思います。

エラーケース

導入

実際に私がエラー時に使用していたコードを基に説明します。

models.py

class Keyword(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

    class Meta:
        db_table = "keywords"

まずは、Djangoのアプリ内で使うモデルを定義します。
フロント側でReactVueを実装する予定なら、JSONとしてデータをやりとりする必要があるのでdjangorestframeworkが必要です。
そして、djangorestframeworkでコードを書いていくなら、JSONデータをやりとりするためにSerializerを作る必要があります。

ちなみに、Serializerの役目は、フロント側から送られてきたJSONデータをサーバーが読めるように変換し、また逆にサーバーから送るクエリセットをJSONデータに変換するものです。
どこかでフロントエンドはJSON色付け係と揶揄されているTwitterの投稿を見かけましたが、その名の通り近年のモダンなフロント側ではJSONデータがやりとりの元なので、Serializerは必須というわけです。

serializers.py

class KeywordSerializer(serializers.ModelSerializer):
    class Meta:
        model = Keyword
        fields = ["id", "name"]

    def validate_name(self, value):
        if len(value) <= 1:
            raise serializers.ValidationError("キーワードは必ず2文字以上で設定してください")

これがKeywordモデルのSerializerです。
サーバー側のValidationはSerializerで行います。
私より優秀な皆様ならどんな内容かこの時点で検討がついたかと思います。笑

エラーの内容

エラーが起きたのは、題名の通り私がPOSTリクエストを送信した時です。つまり、Keywordモデルを新たに作ろうとした時です。

{
  "name" : "白スニーカー"
}

上記のKeywordモデルを基にPOSTMAN等でリクエストを送るのならば上記のようになります(JSON形式)。最もシンプルな形と言えるぐらい簡潔なもので、間違えようがありません。

しかし私は、以下のエラーをゲットしました。

1048, "Column 'name' cannot be null"

値がnullになっているといわれました。何度やっても同じことが言われるので、モデル作成と関わるModel,Serializerを確認しました。そこでエラーが判明しました。

serializers.py

class KeywordSerializer(serializers.ModelSerializer):
    class Meta:
        model = Keyword
        fields = ["id", "name"]

    def validate_name(self, value):
        if len(value) <= 1:
            raise serializers.ValidationError("キーワードは必ず2文字以上で設定してください")
       ## 現場はこちらです
        return value

事件は会議室なんかではなく、Serializerで起きていた様です。
先ほどValidationはSerializerで行うと書きましたが、SerializerにおけるValidationはメソッドで行われるのでreturnを返さなければいけません。

すぐに原因が判明しましたが、検索をしても案外このケースのエラーはヒットしなかったので共有させていただきました。

まとめ

SerializerでValidationを実装するときは、もっと言うなら関数を書くときはreturnを書くのを忘れない様に注意する

この一言に尽きます。

至極しょうもないエラーではありますが、お時間をいただき最後までみてもらいありがとうございました。
間違いや、その他注意した方がいいよくあるエラーなど、なんでも良いのでコメントをくださると嬉しいです。

ありがとうございました。