Viewsets`create()`和`update()`以及Serializers`create()`和`update()`有什么区别?

时间:2017-03-06 00:59:06

标签: 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)假设有一个Viewset ExecutionException和路由器UserViewSet以及序列化器user。如果我向UserSerializer发送POST,是否会调用/user/的{​​{1}}或UserViewSet的{​​{1}}?

2)假设create()拥有此权限:

UserSerializer

如果我向create()发送UserViewSetclass 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 的{​​{1}}是否仍会被调用?

2 个答案:

答案 0 :(得分:2)

  

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

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

  

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

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

进行微调
class UserViewSet(mixins.RetrieveModelMixin,
                  mixins.UpdateModelMixin,
                  mixins.DestroyModelMixin,
                  mixins.ListModelMixin,
                  GenericViewSet):

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

答案 1 :(得分:2)

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

通过调用Serializer的.create()方法执行Serializer的.update().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