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