Django休息更新一个字段

rag*_*.sp 3 django django-serializer django-rest-framework

我刚开始使用 Django 并且陷入了一些我认为应该很简单的事情,但我不知道该怎么做。

我有一个这样的模型:

id = models.AutoField(primary_key=true)
...
amount = models.IntegerField()
...
Run Code Online (Sandbox Code Playgroud)

基本上,用户会给出一个金额,并且模型需要使用当前金额 + 用户输入的金额进行更新。

我使用序列化程序来创建新对象,但我真的不知道如何使用它们来做到这一点。

Pao*_*fan 9

让我们假设以下情况:

  1. 你的模型被称为 MyModel
  2. 你的序列化器类被命名 MyModelSerializer
  3. AmountPartialUpdateView 正在延伸 APIView
  4. 您的部分更新 url 是这样定义的 - 也就是说,模型 id 在pkURL 变量中传递,要添加的数量在amountURL 变量中传递:

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

然后,您应该在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)
Run Code Online (Sandbox Code Playgroud)

这样,访问 URL

model/update-partial/123/5
Run Code Online (Sandbox Code Playgroud)

您将amount模型 id 123的数量增加5 个单位。