Как выполнить "SELECT FOR UPDATE" вместо "SELECT" при изменении и удалении данных в Django Admin?
У меня есть код ниже:
# "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
Change person как показано ниже:
Затем нажмите кнопку Yes, I'm sure
для удаления данных, как показано ниже:
SELECT
выполняется вместо SELECT FOR UPDATE
, как показано ниже:
Теперь я хочу выполнить SELECT FOR UPDATE
вместо SELECT
для обоих случаев, как показано выше.
Итак, как я могу это сделать?
Вам необходимо переопределить get_queryset() с select_for_update() как показано ниже:
# "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
Change person как показано ниже:
Затем нажмите кнопку Yes, I'm sure
для удаления данных, как показано ниже:
SELECT FOR UPDATE
выполняется вместо SELECT
, как показано ниже:
Чтобы выполнить запрос SELECT FOR UPDATE вместо обычного запроса SELECT в Django Admin, вы можете использовать метод select_for_update() для вашего набора запросов. Этот метод заблокирует строки в наборе запросов до фиксации или отката транзакции, не позволяя другим транзакциям изменять данные в этих строках.