视图集`create()` 和`update()` 与序列化器`create()` 和`update()` 之间有什么区别?

use*_*875 9 django serialization django-rest-framework django-rest-viewsets

在这里: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)假设有一个 ViewsetUserViewSet和 routeruser和 serializer UserSerializer。如果我发送了一个POSTto/user/它叫UserViewSet'screate()还是UserSerializer's 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
Run Code Online (Sandbox Code Playgroud)

请问UserSerializercreate()还是被调用,如果我发POST/user/

Lin*_*via 8

1) 假设有一个Viewset UserViewSet 和router user 和serializer UserSerializer。如果我将 POST 发送到 /user/ 它会调用 UserViewSet 的 create() 还是 UserSerializer 的 create()?

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

如果我向 /user/ 发送 POST,UserSerializer 的 create() 是否仍然被调用?

如果权限设置为视图集,则否。但是,如果您想阻止任何创建,您应该微调您的ModelViewSet

class UserViewSet(mixins.RetrieveModelMixin,
                  mixins.UpdateModelMixin,
                  mixins.DestroyModelMixin,
                  mixins.ListModelMixin,
                  GenericViewSet):
Run Code Online (Sandbox Code Playgroud)

将包含除创建之外的所有操作。


Hug*_*nte 5

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

Serializer的.create().update()方法是通过调用.save()Serializer的方法来执行的。

调用.save()将创建新实例或更新现有实例,具体取决于实例化序列化程序类时是否传递了现有实例:

# .save() will create a new instance.
serializer = CommentSerializer(data=data)

# .save() will update the existing `comment` instance.
serializer = CommentSerializer(comment, data=data)
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅保存实例文档