【问题标题】:Django - receiving multiple varities of json objects in the same post methodDjango - 在同一个 post 方法中接收多种 json 对象
【发布时间】:2017-12-26 13:40:13
【问题描述】:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import QandA
from .serializers import QandASerializer
import json
import random
from itertools import count

class QandAlist(APIView):
    _ids = count(0)
    def __init__(self):
            self.id = next(self._ids)
    def get(self, request):
        questions = QandA.objects.all()
        serializer = QandASerializer(questions, many=True)
        return Response(serializer.data)
    def post(self, request):
        serializer = QandASerializer(data=request.data)
            if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            try:
                n = json.loads(request.body)
                return Response(n)
            except:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
            else:
                questions = QandA.objects.order_by('?')[:n] 
                serializer = QandASerializer(questions, many=True)
                return Response(serializer.data)

我在这里尝试接受 2 种 json。一次一个 一种使用 QandA 对象更新数据库的方法 其他看起来像 {“数字”:3} 必须提取此数字并返回 3 个随机 QandA 对象

除了“数字”之外的一切都有效。 try 块总是失败,我得到异常说我错过了 QandA 对象的所有字段

Serializer.py 文件是

from rest_framework import serializers
from .models import QandA

class QandASerializer(serializers.ModelSerializer):

    class Meta:
        model = QandA
        fields = ('question', 'answer', 'option_a', 'option_b', 'option_c')

【问题讨论】:

  • 我认为你想查看 request.DATA,而不是 request.body。
  • 可能也有助于发布 QandASerializer 的定义。
  • 我添加了序列化程序文件。
  • 您收到的确切错误消息是什么?
  • {"answer":["此字段为必填项。"],"option_b":["此字段为必填项。"],"option_a":["此字段为必填项。"] ,"question":["This field is required."],"option_c":["This field is required."]} 这是返回的内容

标签: json django python-2.7


【解决方案1】:

所以,有几件事。

首先,您的QandASerializer 没有number 字段,这是您尝试发布的字段。它还具有序列化程序有效所需的一堆字段。

如果您收到带有“数字”的 POST 数据,则不能使用序列化程序。

def post(self, request):
    number = request.data.get('number')
    if number:
        # grab those random QandA objects and return them
        questions = QandA.objects.order_by('?')[:int(number)] 
        serializer = QandASerializer(questions, many=True)
        return Response(serializer.data)
    else:
        serializer = QandASerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

您可能需要添加额外的检查以确保 number 实际上是一个数字。

【讨论】:

  • 意识到您不想使用您的 number 创建 QandA 对象,因此我删除了答案的那部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多