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

相關問題