首先在請求來的時候會先調用viewset中create(),下面是viewset中create()的源碼
# ModelViewSet中的源碼
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
# 這裡的perform_create是我們關心的
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
在self.perform_create(serializer)這一行,我們可以來看一下perform_create源碼
def perform_create(self, serializer):
serializer.save()
在這裡調用了序列化器的save方法,看一下save()方法,在BaseSerializer這個類中,此類中對create及update實現但是沒有任何動作,save方法中存在這一行代碼
# save方法中的部分代碼
else:
self.instance = self.create(validated_data)
assert self.instance is not None, (
'`create()` did not return an object instance.'
)
在這裡selef.create指的是序列化器中的方法(可以是自己寫的classSerialzer中的create/或者父類中的,比如ModelSerializer),
在這裡其實已經完成了創建的新數據實例並提交到數據庫,個人項目中使用及對序列化器中的create方法的理解,就是前端傳的數據想要創建,但是部分字段沒有傳,可以通過請求信息拿到(比如用戶創建自己當前登錄的賬號的數據,即當前用戶不需要顯性傳值,後端可以在這裡做處理),接下來請在回頭看view中的create方法,其實就是講數據返回給前端,如果項目中沒有使用middleware來對返回數據的格式處理且不希望序列化器默認的返回格式,可以通過視圖中的這個create方法來完成想要返回的數據格式