Как выполнить "SELECT FOR UPDATE" вместо "SELECT" при добавлении данных в Django Admin?
В PersonAdmin():
ниже, Я отменил ответ_добавить() с выбрать_для_обновления() так что перекос записи не происходит, тогда только 2 человек могут быть добавлены на Add person и отменено save_model() так, что obj.save()
работает только при смене человека на Change person:
# "store/admin.py"
from django.contrib import admin
from .models import Person
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
def response_add(self, request, obj, post_url_continue=None):
# Here
obj_count = super().get_queryset(request).select_for_update().all().count()
if obj_count < 2:
obj.save()
return super().response_add(request, obj, post_url_continue)
def save_model(self, request, obj, form, change):
last_part_of_path = request.path.split('/')[-2]
if last_part_of_path == "change":
obj.save() # Here
Но, при добавлении человека на Add person как показано ниже:
SELECT
выполняется вместо SELECT FOR UPDATE
, как показано ниже. * Я использую PostgreSQL и эти журналы ниже являются запросами PostgreSQL и вы можете проверить В PostgreSQL, как регистрировать запросы с транзакционными запросами, такими как "BEGIN" и "COMMIT":
Итак, как я могу выполнить SELECT FOR UPDATE
вместо SELECT
при добавлении человека на Add person?
select_for_update() не работает с count():
# Here # Here
obj_count = super().get_queryset(request).select_for_update().all().count()
Но, select_for_update() работает с len() как показано ниже:
# "store/admin.py"
from django.contrib import admin
from .models import Person
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
def response_add(self, request, obj, post_url_continue=None):
# Here # Here
obj_count = len(super().get_queryset(request).select_for_update().all())
if obj_count < 2:
obj.save()
return super().response_add(request, obj, post_url_continue)
def save_model(self, request, obj, form, change): # Here
last_part_of_path = request.path.split('/')[-2]
if last_part_of_path == "change":
obj.save() # Here
Итак, при добавлении человека на Add person как показано ниже:
SELECT FOR UPDATE
выполняется вместо SELECT
, как показано ниже: