为什么 Django REST API 装饰器破坏了 Django non_atomic_requests 装饰器?

Why are Django REST API decorators breaking the Django non_atomic_requests decorator?

我有一个 Python Django REST API 视图,如下所示:

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 之前和之后创建保存点 - 但重要的是 离开 with 块后不提交

整个视图仍然包含在 BEING 中,并且 COMMIT 仅在视图末尾发布到数据库。

如果我将 @transaction.non_atomic_requests 装饰器移动到装饰器列表的开头,那么我会得到正确的行为,每个 with 块都在其自己的事务中并在末尾提交。

这是怎么回事?

api_view 在后台创建一个 APIView。 根据调用 transaction.non_atomic_requests 的位置,它可能会被添加到错误的函数中(例如 as_view 而不是 myview

文档可能需要更新以强调它。我不记得已经报道过了。