【问题标题】:Django Rest Framework not showing form fields for PATCH/PUT requestDjango Rest Framework 未显示 PATCH/PUT 请求的表单字段
【发布时间】:2021-01-21 05:14:28
【问题描述】:

我有一个使用 Django Rest Framework 的 Django 项目。出于某种原因,当我转到我的一个端点(发出 PATCH/PUT 请求)时,我在可浏览的 API 中看不到任何表单字段。这是资源的代码:

models.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)

views.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')

urls.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。 谁能告诉我为什么会发生这种情况?

【问题讨论】:

  • 能否请您分享端点的 url 模式?
  • @twrought 是的,我已将它们添加到原始帖子中

标签: python django django-rest-framework


【解决方案1】:

如果您将PatientDetailpatch 方法更改为put,表单应该会出现并在URL 上正常运行以更新患者。据我了解,您可以将它们与 DRF 互换使用 (No difference between PUT and PATCH in Django REST Framework)。区别在于是否需要序列化器字段。

不过,它们在低级别技术上是不同的——补丁是真正的“部分更新”(Use of PUT vs PATCH methods in REST API real life scenarios)。

put方法中,你也应该改变

serializer = PatientSerializer(patient, data=request.data['patient'])

serializer = PatientSerializer(data=request.data)

然后,端点应该按预期运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多