Оптимизация 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

@@ -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: