Django rest обновить одно поле

Я только начал работать с Django и застрял на чем-то, что, по моему мнению, должно быть простым, но я не знаю, как это сделать.

У меня есть такая модель:

id = models.AutoField(primary_key=true)
...
amount = models.IntegerField()
...

Обычно пользователь указывает сумму, и модель необходимо обновить, указав текущую сумму + сумму, которую вводит пользователь.

Я использую сериализаторы для создания новых объектов, но я действительно не знаю, как их использовать для этого.

Может быть, хорошей отправной точкой будет этот вопрос: stackoverflow.com/q/41110742/719247

Paolo Stefan 02.05.2018 10:10

попробуйте использовать patch вместо put

Brown Bear 02.05.2018 10:19

@PaoloStefan Я видел этот пост, но он не имел в виду текущее значение, хранящееся в модели, а это то, что мне нужно.

ragtime.sp 02.05.2018 10:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
7 156
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Предположим следующее:

  1. ваша модель называется MyModel
  2. ваш класс сериализатора называется MyModelSerializer
  3. AmountPartialUpdateView расширяет APIView
  4. ваш частичный URL-адрес обновления определяется следующим образом, то есть идентификатор модели передается в переменной URL-адреса pk, а сумма для добавления передается в переменную URL-адреса amount:

    urlpatterns = patterns('',
        # ...
        url(r'^model/update-partial/(?P<pk>\d+)/(?P<amount>\d+)$', AmountPartialUpdateView.as_view(), name='amount_partial_update'),
        # ...
    )
    

Затем вы должны реализовать правильную логику обновления в методе AmountPartialUpdateView.patch(). Один из способов добиться этого:

from django.shortcuts import get_object_or_404
from rest_framework import Response


class AmountPartialUpdateView(APIView):

    def patch(self, request, pk, amount):
        # if no model exists by this PK, raise a 404 error
        model = get_object_or_404(MyModel, pk=pk)
        # this is the only field we want to update
        data = {"amount": model.amount + int(amount)}
        serializer = MyModelSerializer(model, data=data, partial=True)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        # return a meaningful error response
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Таким образом, посетив URL

model/update-partial/123/5

вы увеличите amount модели с идентификатором 123 на единицы 5.

Каким должен быть URL-адрес, на который мне нужно отправить запрос: something / model / update-partial / pk = 1 & amount = 10? Я получаю ошибку 404 для каждой комбинации, которую я пробовал, и я знаю, что есть объект с этим pk

ragtime.sp 02.05.2018 11:21

Хорошо, теперь он что-то делает. Я получаю сообщение об ошибке неподдерживаемые типы операндов для +: int и str. И model.amount, и amount имеют тип int, поэтому я не понимаю, почему он на это жалуется.

ragtime.sp 02.05.2018 11:31

Нет, правильно: amount в сегменте URL передается в качестве побуждения к функции patch () - снова обновляет ответ.

Paolo Stefan 02.05.2018 11:33

Хорошо, теперь мне просто нужно создать метод обновления в сериализаторе. Дай мне попробовать.

ragtime.sp 02.05.2018 11:43
def update(self, instance, validated_data): instance.amount = validated_data['amount'] instance.save() return instance Разве это не сработает? Я получаю сообщение об ошибке, просто сообщая сумму KeyError
ragtime.sp 02.05.2018 11:59

Это не обязательно: если ваш MyModelSerializer расширяет rest_framework.serializers.ModelSerializer, тогда моего кода будет достаточно без необходимости переопределения метода update () сериализатора.

Paolo Stefan 02.05.2018 12:01

Ага, это помогло. Большое спасибо! Вы спасатель!

ragtime.sp 02.05.2018 12:05

просто используйте partial = True в качестве одного из параметров сериализатора и создайте объект для своего поля, которое вы хотите обновить, то есть я хочу обновить статус очереди

    data = {'queue_status': 1}
serializer_patient_queue = PatientQueueSaveSerializer(queue_item, data=data, partial=True)

Другие вопросы по теме