Как выполнить "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

Затем, при изменении данных, как показано ниже:

enter image description here

SELECT выполняется вместо SELECT FOR UPDATE, как показано ниже:

enter image description here

При нажатии на кнопку Delete Change person как показано ниже:

enter image description here

Затем нажмите кнопку Yes, I'm sure для удаления данных, как показано ниже:

enter image description here

SELECT выполняется вместо SELECT FOR UPDATE, как показано ниже:

enter image description here

Теперь я хочу выполнить 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

Затем, при изменении данных, как показано ниже:

enter image description here

SELECT FOR UPDATE выполняется вместо SELECT, как показано ниже:

enter image description here

При нажатии на кнопку Delete Change person как показано ниже:

enter image description here

Затем нажмите кнопку Yes, I'm sure для удаления данных, как показано ниже:

enter image description here

SELECT FOR UPDATE выполняется вместо SELECT, как показано ниже:

enter image description here

Чтобы выполнить запрос SELECT FOR UPDATE вместо обычного запроса SELECT в Django Admin, вы можете использовать метод select_for_update() для вашего набора запросов. Этот метод заблокирует строки в наборе запросов до фиксации или отката транзакции, не позволяя другим транзакциям изменять данные в этих строках.

Вернуться на верх