2016-11-05 38 views
1

我認爲這是最好的解釋與代碼示例。DRF如何知道一個簡單的POST請求應該調用create()?

角使得這樣的POST請求:

router = routers.SimpleRouter() 
router.register(r'accounts', AccountViewSet) 
urlpatterns = [ 
    url(r'^api/', include(router.urls)), 
] 

這裏的AccountViewSet:

$http.post('/api/accounts/', { 
      username: username, 
      password: password, 
      email: email 
} 

它被作爲urls.py拾起Django的

class AccountViewSet(viewsets.ModelViewSet): 
    serializer_class = AccountSerializer 
    queryset = Account.objects.all() 
    lookup_field = 'username' 

    def create(self, request): 
     serializer = self.serializer_class(data=request.data) 

     if serializer.is_valid(): 
      serializer.save() 
      return Response(
       serializer.validated_data, 
       status=status.HTTP_201_CREATED 
      ) 

而這裏的序列化程序:

class AccountSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Account 

    def create(self, validated_data): 
     return Account.objects.create_user(**validated_data) 

在這段代碼中,我可以看到一些轉化爲「如果Angular向api/accounts /發送POST請求的用戶名,密碼和電子郵件地址,請繼續並創建一個帳戶」。

所以我的問題是這樣的:

如何DRF知道叫AccountViewSet.create(),並且正是在AccountSerializer.create()獲取調用?

這裏似乎有很多魔術發生在這裏。

感謝您的幫助。

回答

1

一般來說,在大多數情況下 REST API的每個資源包括2個端點:

  1. 列表/創建端點
  2. 詳細信息(檢索/更新/銷燬)端點。

POST請求用於第一個,用於項目創建。

上述更詳細的端點。端點的URL通常幾乎相同,除了第二個端點中存在的ID之外。例如:

/api/items/ - 列出/創建端點,使用GET-request它將返回項目列表,使用POST請求它將創建一個新項目並將其返回序列化。

/api/items/<item_id>/ - 細節端點,它允許我們處理一些項目,由<item_id>標識。 GET請求返回項目,PUT請求更新整個項目(如果省略了一些非必填字段,則值必須設置爲None),PATCH請求允許部分更新項目,只有在有效載荷字段中提供的內容纔會更新,所有其他字段將保持不變)和DELETE請求,顯然,刪除該項目。

這種方法有時會適用一些限制,但如果你遵循它的話 - 你的代碼會保持苗條和清晰,因爲很多東西都會以的通用方式完成。無論是在項目的後端和前端部分。

+0

謝謝。這解釋得很好。 –

+0

還有一個問題:所以serializer.save()實際上調用AccountSerializer.create()? –

+0

@TomBrock我相信它取決於它的來源。 –

相關問題