视图集 `create()` 和 `update()` 与序列化程序 `create()` 和 `update()` 之间有什么区别?
What's the difference between a Viewsets `create()` and `update()` and a Serializers `create()` and `update()`?
这里:http://www.django-rest-framework.org/api-guide/viewsets/#modelviewset 它说 "The actions provided by the ModelViewSet class are .list(), .retrieve(), .create(), .update(), .partial_update(), and .destroy()."
这里:http://www.django-rest-framework.org/api-guide/serializers/#modelserializer 它说 "The ModelSerializer class is the same as a regular Serializer class, except that: It includes simple default implementations of .create() and .update()."
1) 假设有一个视图集 UserViewSet
和路由器 user
以及序列化器 UserSerializer
。如果我发送一个 POST
到 /user/
,它会调用 UserViewSet
的 create()
还是 UserSerializer
的 create()
?
2)假设UserViewSet
有这个权限:
class NoCreate(permissions.BasePermission):
"""
No one can create this object.
"""
message = 'You do not have permission to complete the action you are trying to perform.'
def has_permission(self, request, view):
if view.action == "create":
return False
return True
如果我向 /user/
发送 POST
,UserSerializer
的 create()
是否仍会被调用?
1) Assuming there is a Viewset UserViewSet and router user and serializer UserSerializer. If I sent a POST to /user/ does it call the UserViewSet's create() or the UserSerializer's create()?
两者都会被调用。视图的创建将获取序列化程序,确保提供的数据有效,调用序列化程序的保存并生成响应。序列化程序的创建将实际执行实例创建——即将其写入数据库。
Does the UserSerializer's create() still get called if I send a POST to /user/?
否,如果权限设置为视图集。但是,如果你想阻止任何创建,你应该微调你的 ModelViewSet
:
class UserViewSet(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
将包含除创建之外的所有操作。
ViewSet 中的.create()
和.update()
方法是在发出请求时执行的操作。使用 POST
方法的请求调用 ViewSet 的 .create()
方法,因为使用 PUT
方法或 PATCH
的请求调用 ViewSet 的 .update()
方法。
Serializer的.create()
和.update()
方法是调用Serializer的.save()
方法执行的
调用 .save()
将创建一个新实例,或更新现有实例,具体取决于在实例化序列化程序时是否传递了现有实例 class:
# .save() will create a new instance.
serializer = CommentSerializer(data=data)
# .save() will update the existing `comment` instance.
serializer = CommentSerializer(comment, data=data)
有关详细信息,请参阅 Saving Instances documentation。
这里:http://www.django-rest-framework.org/api-guide/viewsets/#modelviewset 它说 "The actions provided by the ModelViewSet class are .list(), .retrieve(), .create(), .update(), .partial_update(), and .destroy()."
这里:http://www.django-rest-framework.org/api-guide/serializers/#modelserializer 它说 "The ModelSerializer class is the same as a regular Serializer class, except that: It includes simple default implementations of .create() and .update()."
1) 假设有一个视图集 UserViewSet
和路由器 user
以及序列化器 UserSerializer
。如果我发送一个 POST
到 /user/
,它会调用 UserViewSet
的 create()
还是 UserSerializer
的 create()
?
2)假设UserViewSet
有这个权限:
class NoCreate(permissions.BasePermission):
"""
No one can create this object.
"""
message = 'You do not have permission to complete the action you are trying to perform.'
def has_permission(self, request, view):
if view.action == "create":
return False
return True
如果我向 /user/
发送 POST
,UserSerializer
的 create()
是否仍会被调用?
1) Assuming there is a Viewset UserViewSet and router user and serializer UserSerializer. If I sent a POST to /user/ does it call the UserViewSet's create() or the UserSerializer's create()?
两者都会被调用。视图的创建将获取序列化程序,确保提供的数据有效,调用序列化程序的保存并生成响应。序列化程序的创建将实际执行实例创建——即将其写入数据库。
Does the UserSerializer's create() still get called if I send a POST to /user/?
否,如果权限设置为视图集。但是,如果你想阻止任何创建,你应该微调你的 ModelViewSet
:
class UserViewSet(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
将包含除创建之外的所有操作。
ViewSet 中的.create()
和.update()
方法是在发出请求时执行的操作。使用 POST
方法的请求调用 ViewSet 的 .create()
方法,因为使用 PUT
方法或 PATCH
的请求调用 ViewSet 的 .update()
方法。
Serializer的.create()
和.update()
方法是调用Serializer的.save()
方法执行的
调用 .save()
将创建一个新实例,或更新现有实例,具体取决于在实例化序列化程序时是否传递了现有实例 class:
# .save() will create a new instance.
serializer = CommentSerializer(data=data)
# .save() will update the existing `comment` instance.
serializer = CommentSerializer(comment, data=data)
有关详细信息,请参阅 Saving Instances documentation。