Оптимизация N+1 запросов к ролям пользователей через select_related в middleware
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user