You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django Admin默认「删除所选」操作中执行SELECT FOR UPDATE?

在Django Admin默认删除所选操作中加入SELECT FOR UPDATE

要实现这个需求,需要自定义Django Admin的批量删除action,替代默认的「删除所选」功能,具体做法如下:

1. 编写带锁的批量删除action

在store/admin.py中添加自定义的action函数,通过select_for_update()锁定目标记录后再执行删除,同时用事务包裹确保锁的有效性:

from django.db import transaction
from django.contrib import admin
from .models import Person

def delete_selected_with_lock(modeladmin, request, queryset):
    with transaction.atomic():
        # 基于选中记录的主键重新查询并加锁
        locked_persons = Person.objects.filter(
            pk__in=queryset.values_list('pk', flat=True)
        ).select_for_update()
        # 执行删除并获取删除数量
        deleted_count = locked_persons.delete()[0]
    # 给用户返回操作提示
    modeladmin.message_user(request, f"成功删除{deleted_count}条人员记录")

# 设置action在Admin界面的显示名称,和默认删除操作保持一致
delete_selected_with_lock.short_description = "删除所选人员"

2. 替换Admin类的默认删除操作

将自定义的action注册到PersonAdmin中,替换默认的「删除所选」功能:

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    # 直接指定使用自定义action,覆盖默认的delete_selected
    actions = [delete_selected_with_lock]

    # 若需保留其他默认action,可改用如下方式替换:
    # def get_actions(self, request):
    #     actions = super().get_actions(request)
    #     # 移除默认的删除操作
    #     del actions['delete_selected']
    #     # 添加自定义操作
    #     actions['delete_selected_with_lock'] = delete_selected_with_lock
    #     return actions

完成以上修改后,当你在Admin后台选择人员并执行删除操作时,系统会先执行SELECT ... FOR UPDATE语句锁定目标记录,再执行DELETE操作,整个流程在一个事务中完成,确保锁的作用生效。

内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:45:54