我之前和你也有同样的问题,但是当我挖洞进入睡觉_框架的源代码时,我得到了以下发现,希望能有所帮助:
对于问题1,为什么需要指定PARTIAL=TRUE?
这个问题与HTTP verbs有关.
100:PUT方法将目标资源的所有当前表示形式替换为请求有效负载.
100:Patch方法用于对资源进行部分修改.
一般来说,partial
用于判断客户端向视图提交数据时是否需要模型中的字段进行字段验证.
例如,我们有一个这样的Book
型号,请注意name
和author_name
字段都是mandatory(不为空&;不为空).
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')
对于某些场景,我们可能只需要更新模型中的部分字段,例如,我们只需要更新Book
中的name
字段.因此,对于这种情况,客户机将只向视图提交具有新值的name
字段.客户提交的数据可能如下所示:
{"pk": 1, name: "PYTHON IN A NUT SHELL"}
但是您可能已经注意到,我们的模型定义不允许author_name
为空.所以我们必须用101代替102.因此,睡觉框架将不会对请求数据中缺失的字段执行field validation check.
出于测试目的,您可以为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'),
)
Data to submit
{"pk": 1, name: "PYTHON IN A NUT SHELL"}
当您向/book/update/1/
提交上述json时,您将得到以下错误,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
是将模型实例包装为可序列化对象的对象.您可以使用序列化后的代码生成一个包含serialized.data
的纯JSON字符串.
关于问题3.如何在这里完成实现?
我想当你读完上面的答案时,你可以自己回答,你应该知道什么时候用update
,什么时候用partial_update
.
如果你还有什么问题,尽管问.我刚刚看了睡觉框架的部分源代码,可能有些术语理解得不是很深入,有错误的地方请指正……