我之前曾遇到过与您相同的问题,但是当我深入研究rest_framework的源代码时,我得到了以下发现,希望对您有所帮助:
对于问题1。为什么我们需要指定partial = True?
这个问题与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)
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框架的部分源代码,可能对某些术语不太了解,请在错误的地方指出来...