2017-07-20 11 views
1
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を受け入れようとしています。一度に一つ {「番号」:3}のように見えるQandAオブジェクト 相互にデータベースを更新 1、この番号が抽出されなければならない 3ランダムQandAオブジェクトがを除いDjango - 複数の同じ種類のjsonオブジェクトを同じポストメソッドで受け取る

すべてを返却しなければなりません」数字 "のものが動作します。 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

あなたはリクエストを見ていたいと思う.DATA、request.bodyではない。 – perfect5th

+0

またQandASerializerの定義を投稿すると役に立ちます。 – perfect5th

+0

シリアライザファイルを追加しました。 – th3465

答えて

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が実際の数であることを確認するために、追加のチェックを追加することができます。

+0

あなたの 'number'を使ってQandAオブジェクトを作成したくないことを知ったので、私はその答えの部分を削除しました。 – perfect5th

関連する問題