Загрузка данных


import uuid
from django.core.files.uploadedfile import UploadedFile
from django.contrib.auth import get_user_model
from .models import CustomUser  # Твоя модель пользователя

User = get_user_model()

class UserService:
    """
    Слой бизнес-логики для управления пользователями.
    Здесь нет логики HTTP (заголовков, кук, редиректов). Только чистая работа с данными.
    """

    @staticmethod
    async def update_profile(user: User, data: dict) -> User:
        """
        Принимает объект пользователя и словарь с очищенными данными из Pydantic,
        обновляет БД и возвращает обновленный инстанс.
        """
        for field, value in data.items():
            setattr(user, field, value)
        
        # Используем асинхронный метод сохранения Django 5/6
        await user.asave(update_fields=data.keys())
        return user

    @staticmethod
    async def upload_avatar(user: User, file: UploadedFile) -> str:
        """
        Бизнес-логика обработки аватара: валидация, генерация уникального имени,
        загрузка в облако Yandex Disk / S3 и сохранение пути в модель.
        """
        # 1. Генерируем безопасное имя файла, чтобы избежать коллизий
        ext = file.name.split(".")[-1]
        unique_name = f"avatars/user_{user.id}_{uuid.uuid4().hex[:8]}.{ext}"
        
        # 2. Подменяем имя файла перед сохранением
        file.name = unique_name
        
        # 3. Сохраняем в FileField (Django сам отправит его в S3/Yandex Disk, 
        # если настроен соответствующий Storage backend)
        user.avatar = file
        await user.asave(update_fields=["avatar"])
        
        # 4. Возвращаем абсолютный URL для фронтенда
        return user.avatar.url