Оптимизация N+1 запросов к ролям пользователей через select_related в middleware

This commit is contained in:
2026-01-11 14:19:28 +03:00
parent c070e42cab
commit ed4d509a4e
2 changed files with 33 additions and 1 deletions

View File

@@ -33,6 +33,24 @@ class TenantAdminAccessMiddleware:
}, status=403)
def __call__(self, request):
# Оптимизация: загружаем роль пользователя один раз для всего запроса
if hasattr(request, 'user') and request.user.is_authenticated:
schema_name = getattr(connection, 'schema_name', 'public')
# Только для tenant схем и CustomUser загружаем роль с select_related
if schema_name != 'public':
from accounts.models import CustomUser
if isinstance(request.user, CustomUser):
# Проверяем, не загружена ли уже роль
if not hasattr(request.user, '_role_prefetched'):
try:
# Загружаем пользователя с ролью через select_related
request.user = CustomUser.objects.select_related(
'tenant_role__role'
).get(pk=request.user.pk)
request.user._role_prefetched = True
except CustomUser.DoesNotExist:
pass
# Проверяем, это admin URL?
if request.path.startswith('/admin/'):
# Импортируем здесь чтобы избежать circular imports