我正在接收来自应用程序的KeyError。我的模型中有一个字段patientName
,但是,提出的问题与patientName
有关。有人能帮忙吗?我已经挣扎了好几天了。我不太确定我在这里是否犯了错误。我想使用filter,只接收patientName
、patientNRIC
和patientAddress
,但它失败了。
错误消息:
KeyError at /patient/
'patientName'
Request Method: GET
Request URL: http://localhost:8000/patient/
Django Version: 3.1.7
Exception Type: KeyError
Exception Value:
'patientName'
Exception Location: D:Code_EnviromentVisual_Code_Envprojectmyprojectapi_basicviews.py, line 19, in patient_list
Python Executable: D:pythonpython.exe
Python Version: 3.9.2
Python Path:
['D:\Code_Enviroment\Visual_Code_Env\project\myproject',
'D:\python\python39.zip',
'D:\python\DLLs',
'D:\python\lib',
'D:\python',
'C:\Users\lenovo\AppData\Roaming\Python\Python39\site-packages',
'D:\python\lib\site-packages']
Server time: Thu, 22 Apr 2021 08:01:39 +0000
view.py
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from .models import PatientDetail
from .serializer import PatientSerializer
import sqlite3
# Create your views here.
@api_view(['Get', 'POST'])
# @csrf_exempt
def patient_list(request):
if request.method == 'GET':
data = request.data
patientname = data['patientName']
# patientnric = data['patientNRIC']
patientdetails = PatientDetail.objects.filter(patientName = patientname )
# patientdetails = PatientDetail.objects.all()
# serialization
serializer = PatientSerializer(patientdetails, many=True)
# return Json
return Response(serializer.data)
elif request.method == 'POST':
#data = JSONParser().parse(request)
serializer = PatientSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@api_view(['Get', 'PUT','DELETE'])
@csrf_exempt
def patient_detail(request,patientNRIC):
try:
patientdetails = PatientDetail.objects.get(patientNRIC = patientNRIC)
except PatientDetail.DoesNotExist:
return HttpResponse(status=404)
if request.method == "GET":
# serialization, getting one data only
serializer = PatientSerializer(patientdetails)
# return Json
return JsonResponse(serializer.data)
elif request.method == "PUT":
data = JSONParser().parse(request)
serializer = PatientSerializer(patientdetails, data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data)
return JsonResponse(serializer.errors, status=400)
elif request.method == 'DELETE':
patientdetails.delete()
return HttpResponse(status=204)
型号.py
from django.db import models
from django.db import models
class PatientDetail(models.Model):
patientName = models.CharField(max_length=100)
patientNRIC = models.CharField(max_length=100, primary_key=True)
patientAddress = models.CharField(max_length=100)
patientAllergies = models.CharField(max_length=100)
patientMedicationName = models.CharField(max_length=100)
dosage = models.CharField(max_length=100)
sideEffects = models.CharField(max_length=100)
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.patientName
由于错误状态,您没有在请求体中传递任何请求数据,因此触发了KeyError
。
当您使用POST
方法发送数据时,request.data
将有数据,因为您使用的是GET
方法,所以您的请求体将为空。此外,如果使用GET
方法(如<url-endpoint>/?patientName=John
(并使用request.query_params['patientName']
获取数据,则应使用参数传入数据。