Как сделать запрос PATCH с помощью фреймворка DJANGO REST

Я не очень разбираюсь в 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), это было бы здорово.

22
задан shekhar 13 October 2019 в 06:08
поделиться