9

在这里: 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 类相同,除了:它包括 .创建()和更新()。”

1)假设有一个 ViewsetUserViewSet和 routeruser和 serializer UserSerializer。如果我发送POST/user/它会调用UserViewSet'screate()还是 the 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

如果我发送到UserSerializer's还会被调用吗?create()POST/user/

4

2 回答 2

8

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

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

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

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

class UserViewSet(mixins.RetrieveModelMixin,
                  mixins.UpdateModelMixin,
                  mixins.DestroyModelMixin,
                  mixins.ListModelMixin,
                  GenericViewSet):

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

于 2017-03-06T05:56:18.787 回答
5

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

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

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

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

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

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

于 2017-03-06T14:04:04.787 回答