Я не очень разбираюсь в Django REST framework и пробовал много вещей, но не могу заставить мой запрос 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
"""
.....
Я пытался использовать представление на основе классов:
class UserViewSet(generics.UpdateAPIView):
"""
API endpoint that allows timeentries to be edited.
"""
queryset = TimeEntry.objects.all()
serializer_class = TimeSerializer
Мои URL:
url(r'^api/edit/(?P<pk>\d+)/ Мой 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), это было бы здорово.
, 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), это было бы здорово.