Django 什么';视图集“create()”和“update()”与序列化程序“create()”和“update()”之间的区别是什么?

Django 什么';视图集“create()”和“update()”与序列化程序“create()”和“update()”之间的区别是什么?,django,serialization,django-rest-framework,django-rest-viewsets,Django,Serialization,Django Rest Framework,Django Rest Viewsets,在这里:它说“ModelViewSet类提供的操作有.list(),.retrieve(),.create(),.update(),.partial_update()和.destroy() 这里:它说“ModelSerializer类与常规序列化程序类相同,只是:它包括.create()和.update()的简单默认实现。” 1) 假设有一个ViewsetUserViewSet和路由器user和序列化程序UserSerializer。如果我向/user/发送了POST,它会调用UserViewS

在这里:它说“ModelViewSet类提供的操作有.list(),.retrieve(),.create(),.update(),.partial_update()和.destroy()

这里:它说“ModelSerializer类与常规序列化程序类相同,只是:它包括.create()和.update()的简单默认实现。”

1) 假设有一个Viewset
UserViewSet
和路由器
user
和序列化程序
UserSerializer
。如果我向
/user/
发送了
POST
,它会调用
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) 假设存在一个Viewset UserViewSet和路由器用户以及序列化程序UserSerializer。如果我向/user/发送帖子,它会调用UserViewSet的create()还是UserSerializer的create()

两者都将被称为。视图的create将获取序列化程序,确保提供的数据有效,调用序列化程序的save并生成响应。序列化程序的create将实际执行实例创建,即将其写入数据库

如果我向/user/发送帖子,UserSerializer的create()是否仍会被调用

如果权限设置为viewset,则为否。但是,如果要阻止任何创建,应微调
ModelViewSet

class UserViewSet(mixins.RetrieveModelMixin,
                  mixins.UpdateModelMixin,
                  mixins.DestroyModelMixin,
                  mixins.ListModelMixin,
                  GenericViewSet):
将包含除创建之外的所有操作。

视图集中的
.create()
.update()
方法是在发出请求时执行的操作。使用
POST
方法的请求调用视图集的
.create()
方法,因为使用
PUT
方法或
PATCH
方法的请求调用视图集的
.update()
方法

序列化程序的
.create()
.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)
有关更多详细信息,请参阅