From ed4d509a4e7624c4fedac96d427c8218723e01df Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Sun, 11 Jan 2026 14:19:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20N+1=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D0=BE=D0=B2=20=D0=BA=20=D1=80=D0=BE=D0=BB=D1=8F=D0=BC=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20select=5F?= =?UTF-8?q?related=20=D0=B2=20middleware?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myproject/myproject/admin_access_middleware.py | 18 ++++++++++++++++++ myproject/user_roles/services.py | 16 +++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/myproject/myproject/admin_access_middleware.py b/myproject/myproject/admin_access_middleware.py index 9b7d3e7..921569f 100644 --- a/myproject/myproject/admin_access_middleware.py +++ b/myproject/myproject/admin_access_middleware.py @@ -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 diff --git a/myproject/user_roles/services.py b/myproject/user_roles/services.py index 262cf41..13d28fc 100644 --- a/myproject/user_roles/services.py +++ b/myproject/user_roles/services.py @@ -110,8 +110,22 @@ class RoleService: @staticmethod def get_user_role(user): - """Получить роль пользователя в текущем тенанте""" + """ + Получить роль пользователя в текущем тенанте. + Оптимизация: использует уже загруженные данные если есть select_related. + """ try: + # Проверяем, есть ли уже загруженная роль через select_related + if hasattr(user, 'tenant_role'): + # Проверяем, что tenant_role загружен (а не RelatedObjectDoesNotExist) + try: + user_role = user.tenant_role + if user_role.is_active and hasattr(user_role, 'role'): + return user_role.role + except UserRole.DoesNotExist: + pass + + # Если нет prefetch - делаем запрос user_role = UserRole.objects.get(user=user, is_active=True) return user_role.role except UserRole.DoesNotExist: