gpt4 book ai didi

django - 如何使用 DJANGO REST 框架发出 PATCH 请求

转载 作者:行者123 更新时间:2023-11-28 19:37:41 26 4
gpt4 key购买 nike

我对 Django REST 框架的经验不是很丰富,并且已经尝试了很多东西但无法使我的 PATCH 请求正常工作。

我有一个模型序列化程序。这是我用来添加新条目的同一个条目,理想情况下我想在更新条目时重新使用。

class TimeSerializer(serializers.ModelSerializer):
class Meta:
model = TimeEntry
fields = ('id', 'project', 'amount', 'description', 'date')

def __init__(self, user, *args, **kwargs):
# Don't pass the 'fields' arg up to the superclass
super(TimeSerializer, self).__init__(*args, **kwargs)
self.user = user

def validate_project(self, attrs, source):
"""
Check that the project is correct
"""
.....

def validate_amount(self, attrs, source):
"""
Check the amount in valid
"""
.....

我尝试使用基于类的 View :

class UserViewSet(generics.UpdateAPIView):
"""
API endpoint that allows timeentries to be edited.
"""
queryset = TimeEntry.objects.all()
serializer_class = TimeSerializer

我的网址是:

url(r'^api/edit/(?P<pk>\d+)/$', UserViewSet.as_view(), name='timeentry_api_edit'),

我的 JS 调用是:

var putData = { 'id': '51', 'description': "new desc" }
$.ajax({
url: '/en/hours/api/edit/' + id + '/',
type: "PATCH",
data: putData,
success: function(data, textStatus, jqXHR) {
// ....
}
}

在这种情况下,我希望更新我的描述,但我收到错误信息,指出字段是必需的(对于“项目”和所有其他字段)。验证失败。如果添加到 AJAX 调用所有字段,它在必须检索“项目”时仍然会失败。

我也试着提出自己的看法:

@api_view(['PATCH'])
@permission_classes([permissions.IsAuthenticated])
def edit_time(request):

if request.method == 'PATCH':
serializer = TimeSerializer(request.user, data=request.DATA, partial=True)
if serializer.is_valid():
time_entry = serializer.save()
return Response(status=status.HTTP_201_CREATED)
return Response(status=status.HTTP_400_BAD_REQUEST)

出于同样的原因(字段验证失败),这不适用于部分更新,即使我已发送所有字段,它也不起作用。它创建一个新条目而不是编辑现有条目。

我想重新使用相同的序列化程序和验证,但我愿意接受任何其他建议。此外,如果有人有一段工作代码(ajax 代码-> api View -> 序列化程序)会很棒。

最佳答案

class DetailView(APIView):
def get_object(self, pk):
return TestModel.objects.get(pk=pk)

def patch(self, request, pk):
testmodel_object = self.get_object(pk)
serializer = TestModelSerializer(testmodel_object, data=request.data, partial=True) # set partial=True to update a data partially
if serializer.is_valid():
serializer.save()
return JsonResponse(code=201, data=serializer.data)
return JsonResponse(code=400, data="wrong parameters")

Documentation
您不需要编写 partial_update 或覆盖 update 方法。只需使用 patch 方法即可。

关于django - 如何使用 DJANGO REST 框架发出 PATCH 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21148039/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com