在这里:http://www.django-rest-framework.org/api-guide/viewsets/#modelviewset它说“ModelViewSet类提供的操作是.list(),. retrieve(),. create(),. update(),. partial_update()和.destroy ()“。
在这里:http://www.django-rest-framework.org/api-guide/serializers/#modelserializer它说“ModelSerializer类与普通的Serializer类相同,除了:它包括.create()和.update()的简单默认实现。”
1)假设有一个Viewset ExecutionException
和路由器UserViewSet
以及序列化器user
。如果我向UserSerializer
发送POST
,是否会调用/user/
的{{1}}或UserViewSet
的{{1}}?
2)假设create()
拥有此权限:
UserSerializer
如果我向create()
发送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
的{{1}}是否仍会被调用?
答案 0 :(得分:2)
1)假设有一个Viewset UserViewSet和路由器用户和序列化器UserSerializer。如果我向/ user /发送POST,它会调用UserViewSet的create()或UserSerializer的create()吗?
两者都将被调用。视图的创建将获得序列化程序,确保提供的数据有效,调用序列化程序的保存并生成响应。序列化程序的创建实际上将执行实例创建 - 即将其写入数据库。
如果我向/ user /发送POST,UserSerializer的create()是否仍会被调用?
如果权限设置为视图集,则为否。但是,如果您想阻止任何创建,则应该对ModelViewSet
:
class UserViewSet(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
将包含除创建之外的所有操作。
答案 1 :(得分:2)
ViewSets中的.create()
和.update()
方法是在发出请求时执行的操作。使用POST
方法的请求会调用ViewSet的.create()
方法,因为使用PUT
方法或PATCH
的请求会调用ViewSet的.update()
方法。
通过调用Serializer的.create()
方法执行Serializer的.update()
和.save()
方法。
调用.save()
将创建新实例或更新现有实例,具体取决于实例化序列化程序类时是否传递了现有实例:
# .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。