我對Django REST框架並不十分熟悉,並且嘗試了很多東西,但無法使我的PATCH請求正常工作。如何使用DJANGO REST框架製作PATCH請求
我有一個Model序列化程序。這與我用於添加新條目的條目完全相同,理想情況下我希望在更新條目時重新使用該條目。
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
"""
.....
我試圖使用基於類視圖:
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 code-> api view-> serializer)會很好。
這是一個老問題,但我很好奇,看看會發生什麼,如果你:(1)將請求類型更改爲POST和(2)添加值爲「PATCH」的_method字段。見[這裏](http://www.django-rest-framework.org/topics/browser-enhancements)。 Django rest框架應該照顧部分更新,所以它應該是Just Work。 – Jamie
我更改爲使用PUT而不是PATCH,只發送所有內容,因爲我有權訪問所有數據並以此工作。我記得我還發現了一些東西,並修改了我的代碼。也許現在它可以與PATCH一起使用。對不起,我沒有更多信息。這是一段時間以前。 – Vlad
那麼你能發佈你的工作代碼嗎? @Vlad – Rexford