Метод save

Метод save класса Storage предназначен для сохранения файла в хранилище. Он принимает имя файла и содержимое для записи, а также опциональные параметры, позволяющие управлять процессом сохранения. Метод возвращает строку с именем сохраненного файла, которое может отличаться от переданного в аргументах (например, если в хранилище уже существует файл с таким именем и включена автоматическая генерация уникального имени).

Синтаксис

pythonstorage.save(name, content, max_length=None)

Параметры метода:

Базовое сохранение файла

Рассмотрим сохранение текстового файла в хранилище с использованием метода save:

pythonfrom django.core.files.storage import default_storage
from django.core.files.base import ContentFile

# Создаем содержимое файла
content = ContentFile(b"Hello, World!")

# Сохраняем файл
saved_name = default_storage.save("hello.txt", content)

print(saved_name)

Результат выполнения кода:

python"hello.txt"

В результате файл будет сохранен в хранилище, а метод вернет имя, под которым он был сохранен.

Сохранение с изменением имени файла

Если файл с таким именем уже существует, метод может автоматически сгенерировать новое имя, чтобы избежать конфликта. При использовании стандартного хранилища FileSystemStorage с параметром get_available_name, добавляется суффикс к имени файла:

pythonfrom django.core.files.storage import FileSystemStorage
from django.core.files.base import ContentFile

# Создаем хранилище с автоматическим изменением имени
storage = FileSystemStorage()

# Сохраняем первый файл
content1 = ContentFile(b"First content")
storage.save("test.txt", content1)

# Сохраняем второй файл с тем же именем
content2 = ContentFile(b"Second content")
saved_name = storage.save("test.txt", content2)

print(saved_name)

Результат выполнения кода:

python"test_1.txt"

Как видно из примера, при повторной попытке сохранить файл с тем же именем, метод возвращает новое имя с числовым суффиксом.

Сохранение файла в подпапку

Метод save позволяет указывать относительный путь к файлу внутри хранилища. Это полезно для организации файловой структуры:

pythonfrom django.core.files.storage import default_storage
from django.core.files.base import ContentFile

# Создаем содержимое
content = ContentFile(b"Image data")

# Сохраняем файл в подпапку
saved_name = default_storage.save("images/photo.jpg", content)

print(saved_name)

Результат выполнения кода:

python"images/photo.jpg"

Если указанные подпапки не существуют, они будут созданы автоматически (для некоторых хранилищ это поведение может отличаться).

Использование с моделью

Чаще всего метод save используется внутри модели при сохранении файлового поля. Рассмотрим пример с моделью Document:

pythonfrom django.db import models
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile

class Document(models.Model):
  title = models.CharField(max_length=100)
  file = models.FileField(upload_to="documents/")

  def save(self, *args, **kwargs):
    # Обработка перед сохранением
    super().save(*args, **kwargs)

Для сохранения файла в экземпляр модели можно использовать метод save поля:

pythonfrom myapp.models import Document
from django.core.files.base import ContentFile

# Создаем экземпляр модели
doc = Document(title="My Document")

# Сохраняем файл
content = ContentFile(b"Document content")
doc.file.save("report.txt", content)

# Сохраняем модель
doc.save()

print(doc.file.name)

Результат выполнения кода:

python"documents/report.txt"

Обратите внимание, что метод save поля автоматически вызывает метод save хранилища, поэтому результат одинаковый.

Смотрите также

  • метод open,
    который открывает файл для чтения или записи
  • метод delete,
    который удаляет файл из хранилища
  • метод exists,
    который проверяет существование файла
  • метод get_available_name,
    который возвращает доступное имя для сохранения