Django - 在同一个post方法中接收多个json对象

时间:2017-07-20 17:47:11

标签: json django python-2.7

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')

1 个答案:

答案 0 :(得分:0)

所以,有几件事。

首先,您的QandASerializer没有number字段,这是您尝试POST的字段。它还具有序列化器有效所需的一系列字段。

如果您收到带有'号码的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实际上是一个数字。