我認爲這是最好的解釋與代碼示例。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()獲取調用?
這裏似乎有很多魔術發生在這裏。
感謝您的幫助。
謝謝。這解釋得很好。 –
還有一個問題:所以serializer.save()實際上調用AccountSerializer.create()? –
@TomBrock我相信它取決於它的來源。 –