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')
答案 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
实际上是一个数字。