python - Django Rest Framework 未显示 PATCH/PUT 请求的表单字段
问题描述
我有一个使用 Django Rest Framework 的 Django 项目。出于某种原因,当我转到我的一个端点(发出 PATCH/PUT 请求)时,我在可浏览的 API 中看不到任何表单字段。这是资源的代码:
模型.py
from django.db import models
class Patient(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
diagnosis = models.CharField(max_length=200)
primary_doctor = models.ForeignKey('Doctor', related_name='patients', on_delete=models.CASCADE, null=True)
born_on = models.DateField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return "{0.first_name} {0.last_name}".format(self)
视图.py
from rest_framework.views import APIView
from rest_framework.generics import RetrieveUpdateDestroyAPIView
from rest_framework.response import Response
from rest_framework import status
from django.shortcuts import get_object_or_404
from ..models.patient import Patient
from ..serializers import PatientSerializer
class Patients(APIView):
def get(sef, request):
patients = Patient.objects.all()[:10]
serializer = PatientSerializer(patients, many=True)
return Response(serializer.data)
serializer_class = PatientSerializer
def post(self, request):
patient = PatientSerializer(data=request.data)
if patient.is_valid():
patient.save()
return Response(patient.data, status=status.HTTP_201_CREATED)
else:
return Response(patient.errors, status=status.HTTP_400_BAD_REQUEST)
class PatientDetail(APIView):
def get(self, request, pk):
patient = get_object_or_404(Patient, pk=pk)
serializer = PatientSerializer(patient)
return Response(serializer.data)
serializer_class = PatientSerializer
def patch(self, request, pk):
patient = get_object_or_404(Patient, pk=pk)
serializer = PatientSerializer(patient, data=request.data['patient'])
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk):
patient = get_object_or_404(Patient, pk)
patient.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
序列化程序.py
from rest_framework import serializers
from .models.patient import Patient
class PatientSerializer(serializers.ModelSerializer):
class Meta:
model = Patient
fields = ('id', 'first_name', 'last_name', 'diagnosis', 'born_on', 'primary_doctor', 'created_at', 'updated_at')
网址.py
from django.urls import path
from .views.doctor_views import Doctors, DoctorDetail
from .views.patient_views import Patients, PatientDetail
urlpatterns = [
path('doctors/', Doctors.as_view(), name='doctors'),
path('doctors/<int:pk>/', DoctorDetail.as_view(), name='doctor_detail'),
path('patients/', Patients.as_view(), name='patients'),
path('patients/<int:pk>/', PatientDetail.as_view(), name='patient_detail'),
]
这就是我转到“/patients/3”时浏览器的样子。没有要填写的表单字段,只有 JSON 的内容区域。当我在“/患者”处进行 POST 时,会出现表单字段,我可以正常 POST。谁能告诉我为什么会发生这种情况?
解决方案
如果您将PatientDetail
'patch
方法更改为put
,表单应该会出现并在 url 上正常运行以更新患者。据我了解,您可以将它们与 DRF 互换使用(Django REST Framework 中的 PUT 和 PATCH 之间没有区别)。区别在于是否需要序列化器字段。
虽然,它们在低级别技术上是不同的东西——补丁是真正的“部分更新”(在 REST API 现实生活场景中使用 PUT 与 PATCH 方法)。
在put
方法中,你还应该改变
serializer = PatientSerializer(patient, data=request.data['patient'])
至
serializer = PatientSerializer(data=request.data)
然后,端点应该按预期运行。
推荐阅读
- python - 创建以数字顺序命名的图像文件
- jquery - 横幅在 FF 中完美显示,而不是在 Chrome 中
- angular - 无限循环上调用的 Firebase 云函数
- linux - 使用'at'命令在第二天录制视频流并且只做一次
- google-sheets - Google表格中QUERY内的IF语句
- powershell - 通过 netcat 传输文件作为 Powershell 中的后台作业
- c# - c#在幻灯片上插入多个形状组时出错
- ruby-on-rails - 如果在类主体中调用了方法,如何在 Ruby/Rails 中进行测试?
- web-scraping - Linux 中的 Scrapy Splash + Crawlera 总是出现 503 服务不可用错误
- android - 您如何将数据从当前活动传递到以前的活动