我正在尝试partial_update
使用Django Rest Framework进行实施,但由于我被卡住了,因此需要澄清一下。
为什么我们需要指定partial = True?
以我的理解,我们可以轻松地在partial_update
方法内部更新Demo对象。这样做的目的是什么?
序列化变量里面有什么? 方法变量
内部是什么?那是一个演示对象吗?在后台调用什么功能?serialized``partial_update
一个人如何在这里完成实施?
视图集
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的源代码时,我得到了以下发现,希望对您有所帮助:
这个问题与HTTP动词有关。
PUT :PUT方法用请求有效载荷替换目标资源的所有当前表示形式。
PATCH :PATCH方法用于对资源进行部分修改。
通常,partial
用于在客户向视图提交数据时检查模型中的字段是否需要进行字段验证。
例如,我们有一个Book
这样的模型,请注意name
和author_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"
}
serialized
是将模型实例包装为可序列化对象的对象。并且您可以使用此序列化生成带有的纯JSON字符串serialized.data
。
我认为您在阅读完上述答案后就可以回答自己,并且应该知道何时使用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的构建变