Django休息更新一个字段

时间:2018-05-02 07:50:52

标签: django django-rest-framework django-serializer

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

我有一个像这样的模型:

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

基本上,用户将提供金额,模型需要使用当前金额+用户输入的金额进行更新。

我使用序列化程序来创建新对象,但我真的不知道如何使用它们来执行此操作。

2 个答案:

答案 0 :(得分:2)

我们假设以下内容:

  1. 您的模型名为MyModel
  2. 您的序列化程序类名为MyModelSerializer
  3. AmountPartialUpdateView正在扩展APIView
  4. 您的部分更新网址定义如下 - 即模型ID为 传入pk网址变量,并在amount网址变量中传递要添加的金额:

    urlpatterns = patterns('',
        # ...
        url(r'^model/update-partial/(?P<pk>\d+)/(?P<amount>\d+)$', AmountPartialUpdateView.as_view(), name='amount_partial_update'),
        # ...
    )
    
  5. 然后,您应该在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)
    

    这样,访问网址

    model/update-partial/123/5
    

    您将以 5 为单位增加模型ID 123 amount

答案 1 :(得分:0)

只需将partial = True用作序列化程序参数之一,并为要更新的文件字段创建对象,即我要更新队列状态

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