質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.34%

【Python Django】REST APIでリクエスト受信後、Serializerでvalidated_dataを確認すると空のリストが返ってくる。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,690

いつもお世話になります。
現在Djangoを使用してAPIを作成しています。
APIで受け取ったリクエストデータを送信して、APIで取得し、そのデータをSerializerクラスで
バリデーションを行い、バリデーションが完了したデータをDBに登録する。

という流れを想定しているのですが、Serializerにデータを投げた後に、create関数に移動し、
引数のvalidated_dataを確認すると、何も入っていないカラのリストが返されてしまいます。

値の渡し方や、JSONの送り方が、悪いのかいろいろと試したのですが、解決策が見つからない状況です。

このコードの書き方が悪い、ここはチェックした?などのご指摘やアドバイスをいただけないでしょうか。

よろしくお願いいたします。

処理の流れイメージ。

①JSONをARCで送信。
②spAPIでリクエストを受信
③serial = self.get_serializer(data=test)
serial.is_valid()
で、データのバリデーションを開始。
④SpListSerializerに移り子をSpSerializerとし、バリデーションを行う。
⑤ここで、SpListSerializer>def create>validated_dataが空のリスト[]が返ってくる。
期待値は、上記記載のJSONが確認できること。

*バリデーションする値が複数あるためListSerializerを用いてます。
*Python 3.X
*Django 2.X

コード

# model
class result_data(models.Model):
    id = models.UUIDField("Unique Molecule ID(auto numbering)",
                          primary_key=True, default=uuid.uuid4, editable=False)
    wa = models.ForeignKey('wa', on_delete=models.CASCADE)
    value = models.FloatField(verbose_name='値', default=0);
    create_date = models.DateTimeField(
        verbose_name='作成日', auto_now_add=True)
    update_date = models.DateTimeField(
        verbose_name='更新日', auto_now=True)


# 送信したJSON
{"ListColInfo":
 [
  {"result_data":[{
    "value":1.22,
    "wa_id":1,
   }]

 }]
}


# API
class SpApi(CreateAPIView):
    serializer_class = SpListSerializer

    def post(self, request, *args, **kwargs):

        test = request.data

        serial = self.get_serializer(data=test)
        serial.is_valid()
        try:
            with transaction.atomic():
                result = serial.save()
                print(result)
        except IntegrityError:
            return Response(None, status=status.HTTP_400_BAD_REQUEST)

        headers = self.get_success_headers(serial.data)
        return Response(serial.data, status=status.HTTP_201_CREATED, headers=headers)


# Serializer
class SpSerializer(serializers.Serializer):
    wa_id = serializers.IntegerField(read_only=True)
    value = serializers.FloatField(read_only=True)

    def create(self, validated_data):
        raise NotImplementedError('not use')

    def update(self, instance, validated_data):
        raise NotImplementedError('not use')

# ListSerializer
class SpListSerializer(serializers.ListSerializer):
    child = SpSerializer(many=True)

    def create(self, validated_data): #ここでカラのListが返される。
        return validated_data
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

JSONの書き方に問題があったようです。

ご迷惑をおかけしました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Pythonに関する質問
  • 【Python Django】REST APIでリクエスト受信後、Serializerでvalidated_dataを確認すると空のリストが返ってくる。