{'field': [ErrorDetail(string='this field is required.', code='required')] - DJANGO REST 框架



我试图解析JSON数据并通过API将其导入数据库。我想我几乎得到了它,但仍然得到这个消息:{'field': [ErrorDetail(string='This field is required.', code='required')]从我的HttpResponse,我真的不知道该怎么做。

下面是我的代码:

models.py

from django.db import models
class Data(models.Model):
name = models.CharField(max_length=255, blank=False)
eid = models.DecimalField(max_digits=10, decimal_places=0, blank=False)
data = models.TextField(max_length=800, blank=True)
def __str__(self):
return "ID: {} -- Name: {}".format(self.eid, self.name)

serializers.py

老实说,我认为问题出在序列化器上,但我不知道该在这里添加什么。

from .models import Data
from rest_framework import serializers
class DataSerializer(serializers.ModelSerializer):
class Meta:
model = Data
fields = ['name', 'eid', 'data']
class DetailSerializer(serializers.ModelSerializer):
class Meta:
model = Data
fields = '__all__'

views.py

这里我必须有3个视图。首先是导入。其次是显示基本数据,如名称,id等,这些数据来自我提供给import/API的JSON文件。第三个是JSON文件中给出的数据的完整细节。

from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse, HttpResponse
from rest_framework.parsers import JSONParser
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.exceptions import ParseError
from rest_framework.authentication import BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from .serializers import DataSerializer, DetailSerializer
from .models import Data
@csrf_exempt            
@api_view(['POST'])     
@permission_classes([IsAuthenticated])  
@authentication_classes([BasicAuthentication])  
#IMPORT VIEW
def import_data(request):
if request.method == 'POST':
try:
data = JSONParser().parse(request) 
serializer = DataSerializer(data=data, many=True) 
serializer.is_valid() 
except ParseError: 
return JsonResponse({"detail":"DATA YOU IMPORTED ARE NOT JSON DATA"}, safe=False, status=400)
except KeyError:
return JsonResponse({"detail":"NAME AND ID MUST BE INCLUDED"}, safe=False, status=400)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, safe=False, status=201)
else:
return HttpResponse(serializer.errors)
else:
return JsonResponse({"detail":"ACCEPTING ONLY POST REQUESTS"}, safe=False, status=400)        

@csrf_exempt
@api_view(['GET'])
def data_view(request, name):
if request.method == 'GET':
data = Data.objects.filter(name__iexact=name)
if data:
serializer = DataSerializer(data, many=True)
serializer.is_valid()
return JsonResponse(serializer.data, safe=False, status=200)
else:
return JsonResponse({"detail":"NO DATA FOUND"}, safe=False, status=404)
else:
return JsonResponse({"detail":"ACCEPTING ONLY GET REQUESTS"}, safe=False, status=400)    
@csrf_exempt
@api_view(['GET'])
def data_details(request, name, eid):
if request.method == 'GET':
data = Data.objects.filter(name__iexact=name, eid=eid)
if data:
serializer = DetailSerializer(data['eid'], many=False)
# serializer.is_valid()
return JsonResponse(serializer.data, status=200)
else:
return JsonResponse({"details":"DATA NOT FOUND"}, safe=False, status=404)
else:
return JsonResponse({"details":"ACCEPTING ONLY GET REQUESTS"}, safe=False, status=400)

谢谢你的帮助<</div>

类视图示例:

from rest_framework.response import Response
from rest_framework.views import APIView

class ImportDataView(APIView): 
queryset = Data.objects.all()
serializer_class = DataSerializer
permission_classes = (IsAuthenticated,)
authentication_classes = (BasicAuthentication,)

def post(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)

import_data = ImportDataView.as_view()