当前位置: 首页 > 面试题库 >

Django Rest Framework部分更新

令狐跃
2023-03-14
问题内容

我正在尝试partial_update使用Django Rest Framework进行实施,但由于我被卡住了,因此需要澄清一下。

  1. 为什么我们需要指定partial = True?
    以我的理解,我们可以轻松地在partial_update方法内部更新Demo对象。这样做的目的是什么?

  2. 序列化变量里面有什么? 方法变量
    内部是什么?那是一个演示对象吗?在后台调用什么功能?serialized``partial_update

  3. 一个人如何在这里完成实施?

视图集

class DemoViewSet(viewsets.ModelViewSet):
    serializer_class = DemoSerializer

    def partial_update(self, request, pk=None):
        serialized = DemoSerializer(request.user, data=request.data, partial=True)
        return Response(status=status.HTTP_202_ACCEPTED)

序列化器

class DemoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Demo
        fields = '__all__'

    def update(self, instance, validated_data):
        print 'this - here'
        demo = Demo.objects.get(pk=instance.id)
        Demo.objects.filter(pk=instance.id)\
                           .update(**validated_data)
        return demo

问题答案:

我和您以前有相同的问题,但是当我深入研究rest_framework的源代码时,我得到了以下发现,希望对您有所帮助:

对于问题1。为什么我们需要指定partial = True?

这个问题与HTTP动词有关。

PUT :PUT方法用请求有效载荷替换目标资源的所有当前表示形式。

PATCH :PATCH方法用于对资源进行部分修改。

通常,partial用于在客户向视图提交数据时检查模型中的字段是否需要进行字段验证。

例如,我们有一个Book这样的模型,请注意nameauthor_name字段都是 必填 字段(不为null且不为空白)。

class Book(models.Model):
    name = models.CharField('name of the book', max_length=100)
    author_name = models.CharField('the name of the author', max_length=50)

# Create a new instance for testing
Book.objects.create(name='Python in a nut shell', author_name='Alex Martelli')

在某些情况下,我们可能只需要更新模型中的部分字段,例如,我们只需要更新中的name字段即可Book。因此,在这种情况下,客户端将只向name视图提交具有新值的字段。从客户端提交的数据可能如下所示:

{"pk": 1, name: "PYTHON IN A NUT SHELL"}

但是您可能已经注意到,我们的模型定义不允许author_name为空。因此,我们必须使用 partial_update 而不是
update 。因此,其余框架将不会对请求数据中缺少的字段执行 字段验证检查

出于测试目的,您可以为update和创建两个视图partial_update,您将对我刚才所说的内容有更多的了解。

例:

views.py

from rest_framework.generics import GenericAPIView
from rest_framework.mixins import UpdateModelMixin
from rest_framework.viewsets import ModelViewSet
from rest_framework import serializers


class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book


class BookUpdateView(GenericAPIView, UpdateModelMixin):
    '''
    Book update API, need to submit both `name` and `author_name` fields
    At the same time, or django will prevent to do update for field missing
    '''
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

class BookPartialUpdateView(GenericAPIView, UpdateModelMixin):
    '''
    You just need to provide the field which is to be modified.
    '''
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def put(self, request, *args, **kwargs):
        return self.partial_update(request, *args, **kwargs)

urls.py

urlpatterns = patterns('',
    url(r'^book/update/(?P<pk>\d+)/$', BookUpdateView.as_view(), name='book_update'),
    url(r'^book/update-partial/(?P<pk>\d+)/$', BookPartialUpdateView.as_view(), name='book_partial_update'),
)

提交数据

{"pk": 1, name: "PYTHON IN A NUT SHELL"}

当您将上述json提交到时/book/update/1/,您会收到HTTP_STATUS_CODE = 400的以下错误:

{
  "author_name": [
    "This field is required."
  ]
}

但是,当您将上述json提交给时/book/update-partial/1/,您将获得HTTP_STATUS_CODE = 200并显示以下响应,

{
  "id": 1,
  "name": "PYTHON IN A NUT SHELL",
  "author_name": "Alex Martelli"
}

对于问题2。序列化变量的内部是什么?

serialized是将模型实例包装为可序列化对象的对象。并且您可以使用此序列化生成带有的纯JSON字符串serialized.data

对于问题3。如何在这里完成实施?

我认为您在阅读完上述答案后就可以回答自己,并且应该知道何时使用update和何时使用partial_update

如果您还有任何疑问,请随时提问。我只是阅读了rest框架的部分源代码,可能对某些术语不太了解,请在错误的地方指出来…



 类似资料:
  • 不重复造轮子,是开发人员共同的哲学道理。在使用 Python 开发 RESTful Web API 时,就有一个大名鼎鼎的轮子 Django REST framework,这一节我们就来简单了解一下 Django REST framework。 Django REST framework 一听就是和著名的 Python web 开发框架 Django 有很大的关系,这个框架是由 Tom Chris

  • 问题内容: 如何使用NEST2部分更新记录? 我正在寻找一个模拟请求:POST / erection / shop / 1 / _update {“ doc”:{“ new”:“ 0”}} 而无需重新 创建新记录。不幸的是,我没有在www.elastic.co/guide/en/elasticsearch/client/net- api/current/index.html中找到有关更新的任何信息

  • 问题内容: 我想做如下的部分更新。添加一些新字段,例如Bytes_In和Bytes_Out。并且还运行脚本来更新使用脚本从其他字段派生的字段。 脚本session-duration-script.groovy在/ config / scripts路径下。 当我运行上述更新查询时,出现此错误 请让我知道有办法实现这种更新。 问题答案: 由于错误状态,您不能同时使用和。我的建议是修改脚本,以添加所需的

  • 我们要求当前在SOLR中索引的文档可能需要定期进行部分更新。更新可以是。添加新字段B。更新现有字段的内容。我们模式中的一些字段是存储的,其他的没有。 Solr4确实允许这样做,但必须存储所有字段。见Update a new field to existing document和http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-updat

  • 我们使用Golang实现了一个包含CRUD的REST API,在Update服务中,客户端可以发送部分JSON(包括更改的字段),我们需要处理这些更改对实体的更新。 逻辑上,我们需要通过Id从DB获取实体到结构,然后将有效载荷json解封到另一个结构并更新实体。 这是一个简单的例子,实际上它可能是一个嵌套的结构和嵌套的json,我们如何用golang或事件其他语言(如Java,.NET)来处理这种

  • 我在收集JSON的Nifi中获得了一些数据,但是它需要插入的表具有不同的格式。 我很难将JSON结构分解成更小的部分--第二个部分似乎是两三个部分的转变。有什么想法能让我进入下一步吗? 产出:

  • 我在一个结构中有一个固定大小的缓冲区,我想在它中间复制一些数据。 我现在唯一能看到的就是从开始的部分,加上我想要的,然后在最后加上部分,但是我确信这会导致一两个我想要避免的大副本,我只是需要更新中间的缓冲区。有没有一种简单的方法可以做到这一点而不使用不安全的代码?

  • 问题内容: 为什么要使用一个来公开Django应用程序的API? 问题答案: TastyPie 正如Torsten所指出的那样,使用与令人敬畏的django-haystack相同的偷偷摸摸的东西写的东西不会出错。从我在邮件列表中看到的内容来看,Daniel Lindsey等人非常有帮助,Tastypie稳定,全面并且有据可查 出色的表现为你提供了一套明智的默认行为,并使使用这种样式的API的构建变