【问题标题】:What's the difference between a Viewsets `create()` and `update()` and a Serializers `create()` and `update()`?Viewsets `create()` 和 `update()` 和 Serializers `create()` 和 `update()` 有什么区别?
【发布时间】:2017-07-25 18:05:26
【问题描述】:

在这里: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 和 router user 和 serializer 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

如果我将POST 发送到/user/UserSerializercreate() 是否仍会被调用?

【问题讨论】:

    标签: django serialization django-rest-framework django-rest-viewsets


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      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)
      

      有关详细信息,请参阅Saving Instances documentation

      【讨论】:

        猜你喜欢
        • 2017-12-19
        • 1970-01-01
        • 1970-01-01
        • 2019-02-07
        • 2019-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-16
        相关资源
        最近更新 更多