【问题标题】:How to run "SELECT FOR UPDATE" instead of "SELECT" when changing and deleting data in Django Admin?在 Django Admin 中更改和删除数据时如何运行 \"SELECT FOR UPDATE\" 而不是 \"SELECT\"?
【发布时间】:2022-12-15 14:08:31
【问题描述】:
我有以下代码:
# "store/models.py"
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=30)
# "store/admin.py"
from django.contrib import admin
from .models import Person
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
pass
然后,当更改数据时如下所示:
SELECT 代替 SELECT FOR UPDATE 运行,如下所示:
而且,当点击Delete按钮的换人如下所示:
然后点击Yes, I'm sure按钮删除数据如下图:
SELECT 代替 SELECT FOR UPDATE 运行,如下所示:
现在,如上所示,我想为这两种情况运行 SELECT FOR UPDATE 而不是 SELECT。
那么,我该怎么做呢?
【问题讨论】:
标签:
python
python-3.x
django
django-admin
select-for-update
【解决方案1】:
您需要使用 select_for_update() 覆盖 get_queryset() ,如下所示:
# "store/admin.py"
from django.contrib import admin
from .models import Person
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super().get_queryset(request)
last_part_of_referer = request.META.get('HTTP_REFERER').split('/')[-2]
last_part_of_uri = request.build_absolute_uri().split('/')[-2]
if (last_part_of_referer == "change" and last_part_of_uri == "change") or
(last_part_of_referer == "delete" and last_part_of_uri == "delete"):
qs = qs.select_for_update()
return qs
然后,当更改数据时如下所示:
SELECT FOR UPDATE 代替 SELECT 运行,如下所示:
而且,当点击Delete按钮的换人如下所示:
然后点击Yes, I'm sure按钮删除数据如下图:
SELECT FOR UPDATE 代替 SELECT 运行,如下所示: