2

在这里:http://www.django-rest-framework.org/api-guide/viewsets/#modelviewset它表示“ModelViewSet类提供的操作是.list(),.retrieve(),.create(),.update(),.partial_update()和.destroy()。”它说:“ModelSerializer类与普通的Serializer类相同,不同之处在于:它包含.create()和.update()的简单默认实现。”Viewsets`create()`和`update()`和一个序列化器`create()`和`update()`有什么区别?

1)假设有一个Viewset UserViewSet和路由器user和串行器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 

是否UserSerializercreate()如果我发送一个POST/user/仍然可以叫什么名字?

回答

2

1)假设有一个Viewset UserViewSet和路由器用户和序列化程序UserSerializer。如果我发送POST到/ user /它调用UserViewSet的create()或UserSerializer的create()?

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

如果我发送POST到/ user /,UserSerializer的create()仍然会被调用吗?

如果将权限设置为视图,则否。但是,如果你想防止任何创作,你应该微调您的ModelViewSet

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

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

1

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

该串行器的.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

相关问题