DRF中關於viewset中create()和serializers中的create及perform_create

首先在請求來的時候會先調用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方法來完成想要返回的數據格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值