0

我有這樣一個Python Django的REST API的觀點:爲什麼Django REST API裝飾器會破壞Django的non_atomic_requests裝飾器?

from rest_framework.decorators import api_view, permission_classes 
from django.db import transaction 

@api_view([ 'POST' ]) 
@permission_classes((IsAuthenticated,)) 
@transaction.non_atomic_requests 
def myview(request): 
    with transaction.atomic(): 
     db_do_something1() 

    with transaction.atomic(): 
     do_do_something2() 

    return some_response 

的SQL實際運行對在這種情況下,我的PostgreSQL數據庫之前和db_do_something12後創建的保存點 - 但嚴格離開後不提交與塊。

整個視圖仍然包裝在一個BEINGCOMMIT只發布到視圖結束時的數據庫。

如果我將@transaction.non_atomic_requests修飾器移動到修飾器列表的開頭,那麼我會得到正確的行爲,每個with塊都在其自己的事務中,並在末尾提交。

這是怎麼回事?

回答

1

api_view在幕後創建了一個APIView。 根據其中transaction.non_atomic_requests被調用時,它可能會被添加到了錯誤的功能(如as_view代替myview

的文檔可能需要更新把一些重點就可以了。我不記得這是已報告。