Viewsets中的`create()`和`update()`与Serializers中的`create()`和`update()`有什么区别?

10

这里: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 UserViewSet 和路由 user 以及序列化器 UserSerializer。如果我向 /user/ 发送 POST 请求,那么它会调用 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
< p >如果我向/user/发送一个POST请求,UserSerializercreate()是否仍会被调用?

2个回答

9
假设有一个Viewset UserViewSet,路由器为user,序列化程序为UserSerializer。如果我向/user/发送POST请求,它会调用UserViewSet的create()还是UserSerializer的create()?
两者都会被调用。视图的create会获取序列化程序,确保提供的数据有效,调用序列化程序的保存并生成响应。序列化程序的create将实际执行实例创建 - 即将其写入数据库。
如果我向/user/发送POST请求,UserSerializer的create()仍然会被调用吗?
如果设置了视图集的权限,则不会被调用。但是,如果您想防止任何创建操作,则应微调您的ModelViewSet:
class UserViewSet(mixins.RetrieveModelMixin,
                  mixins.UpdateModelMixin,
                  mixins.DestroyModelMixin,
                  mixins.ListModelMixin,
                  GenericViewSet):

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


5
在ViewSets中,.create().update()方法是在请求时执行的操作。使用 POST 方法的请求调用 ViewSet 的 .create() 方法,而使用 PUT 方法或 PATCH 方法的请求则调用 ViewSet 的 .update() 方法。
在 Serializer 中,通过调用 Serializer 的 .save() 方法来执行 .create().update() 方法。
调用 .save() 方法会根据在实例化序列化器类时传递的现有实例的情况,创建新实例或更新现有实例:
# .save() will create a new instance.
serializer = CommentSerializer(data=data)

# .save() will update the existing `comment` instance.
serializer = CommentSerializer(comment, data=data)

查看保存实例文档以获取更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接