如何在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
相关产品推荐
相关产品推荐

