Я только начал работать с Django и застрял на чем-то, что, по моему мнению, должно быть простым, но я не знаю, как это сделать.
У меня есть такая модель:
id = models.AutoField(primary_key=true)
...
amount = models.IntegerField()
...
Обычно пользователь указывает сумму, и модель необходимо обновить, указав текущую сумму + сумму, которую вводит пользователь.
Я использую сериализаторы для создания новых объектов, но я действительно не знаю, как их использовать для этого.
попробуйте использовать patch
вместо put
@PaoloStefan Я видел этот пост, но он не имел в виду текущее значение, хранящееся в модели, а это то, что мне нужно.
Предположим следующее:
MyModel
MyModelSerializer
AmountPartialUpdateView
расширяет APIView
ваш частичный 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
Хорошо, теперь он что-то делает. Я получаю сообщение об ошибке неподдерживаемые типы операндов для +: int и str. И model.amount, и amount имеют тип int, поэтому я не понимаю, почему он на это жалуется.
Нет, правильно: amount
в сегменте URL передается в качестве побуждения к функции patch () - снова обновляет ответ.
Хорошо, теперь мне просто нужно создать метод обновления в сериализаторе. Дай мне попробовать.
def update(self, instance, validated_data): instance.amount = validated_data['amount'] instance.save() return instance
Разве это не сработает? Я получаю сообщение об ошибке, просто сообщая сумму KeyError
Это не обязательно: если ваш MyModelSerializer расширяет rest_framework.serializers.ModelSerializer, тогда моего кода будет достаточно без необходимости переопределения метода update () сериализатора.
Ага, это помогло. Большое спасибо! Вы спасатель!
просто используйте partial = True в качестве одного из параметров сериализатора и создайте объект для своего поля, которое вы хотите обновить, то есть я хочу обновить статус очереди
data = {'queue_status': 1}
serializer_patient_queue = PatientQueueSaveSerializer(queue_item, data=data, partial=True)
Может быть, хорошей отправной точкой будет этот вопрос: stackoverflow.com/q/41110742/719247