视图集 `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/,它会调用 UserViewSetcreate() 还是 UserSerializercreate()

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/ 发送 POSTUserSerializercreate() 是否仍会被调用?

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