我和您以前有相同的问题,但是当我深入研究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)# Create a new instance for testingBook.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 GenericAPIViewfrom rest_framework.mixins import UpdateModelMixinfrom rest_framework.viewsets import ModelViewSetfrom rest_framework import serializersclass BookSerializer(serializers.ModelSerializer): class meta: model = Bookclass 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并显示以下响应,
对于问题2。序列化变量的内部是什么?{ "id": 1, "name": "PYTHON IN A NUT SHELL", "author_name": "Alex Martelli"}
serialized是将模型实例包装为可序列化对象的对象。并且您可以使用此序列化生成带有的纯JSON字符串
serialized.data。对于问题3。如何在这里完成实施?
我认为您在阅读完上述答案后就可以回答自己,并且应该知道何时使用
update和何时使用
partial_update。
如果您还有任何疑问,请随时提问。我只是阅读了rest框架的部分源代码,可能对某些术语不太了解,请在错误的地方指出来…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)