python 默认情况下,Django管理操作中是否使用事务?

f8rj6qna  于 2023-01-01  发布在  Python
关注(0)|答案(1)|浏览(165)

根据我的测试,我知道默认情况下,在Django Admin中添加、更改和删除数据时会使用事务。
但是,我选择了删除选定的人并点击了Django管理员操作中的Go。* 我使用PostgreSQL:

然后,点击是,我确定删除数据:

现在,只有一个查询DELETE运行,而没有包括BEGINCOMMIT之间的一个或多个其他查询,如下所示,所以我怀疑默认情况下,事务是否在Django管理操作中使用。* 以下是PostgreSQL查询日志,您可以检查如何记录PostgreSQL查询

那么默认情况下,事务是否在Django管理操作中使用?

qco9c6ql

qco9c6ql1#

不,默认情况下,事务不用于Django管理操作
首先,您可以看到@transaction.atomicwith transaction.atomic():没有用于下面的默认delete_queryset()

class ModelAdmin(BaseModelAdmin):
    
    # ...

    def delete_queryset(self, request, queryset):
        """Given a queryset, delete it from the database."""
        queryset.delete()

    # ...

其次,如果您将select_for_update()代码添加到delete_queryset(),方法是覆盖它,如下所示:

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):

    def delete_queryset(self, request, queryset):
        print(queryset.select_for_update()) # Here
        queryset.delete()

然后,选择删除选定的人并点击Django管理员操作中的Go

然后,点击是,我确定删除数据:

您将得到下面的错误,因为select_for_update()需要与transaction一起使用,这意味着 * 默认情况下,transaction不用于Django管理操作*:
django.db.transaction.transactionManagementError:数据库事务管理错误:select_for_update不能在事务之外使用。

相关问题