Поле FileField

Поле FileField в Django предназначено для хранения файлов, загружаемых через формы или создаваемых программно. Оно хранит в базе данных строку с путем к файлу относительно корня медиа-директории, а сам файл сохраняется в файловой системе или облачном хранилище. Поле принимает обязательный параметр upload_to, который определяет директорию для сохранения загружаемых файлов. Это может быть как строка с путем, так и функция, генерирующая динамическое имя файла на основе экземпляра модели и имени исходного файла.

Параметры

Основные параметры поля FileField:

pythonFileField(
  upload_to='uploads/',
  storage=None,
  max_length=100,
  blank=False,
  null=False,
  unique=False,
  db_index=False,
  default='',
  validators=[],
  error_messages=None,
  help_text='',
  verbose_name='',
)

Параметр upload_to определяет путь внутри директории MEDIA_ROOT, куда будут сохраняться загруженные файлы. Параметр storage позволяет указать пользовательскую систему хранения файлов. Параметр max_length задает максимальную длину строки с путем к файлу в базе данных, по умолчанию 100 символов.

Синтаксис объявления в модели

pythonfrom django.db import models

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

Пример

Объявим модель для хранения загружаемых пользователями документов:

pythonfrom django.db import models

class UploadedFile(models.Model):
  name = models.CharField(max_length=100)
  description = models.TextField(blank=True)
  file = models.FileField(upload_to='uploads/')
  uploaded_at = models.DateTimeField(auto_now_add=True)

  def __str__(self):
    return self.name

Пример

Создадим экземпляр модели с загруженным файлом:

pythonfrom myapp.models import UploadedFile
from django.core.files import File

# Creating instance with file
doc = UploadedFile(
  name='Report',
  description='Annual financial report'
)

# Save file (assuming file is opened)
with open('/path/to/report.pdf', 'rb') as f:
  doc.file.save('report.pdf', File(f))

doc.save()

Пример

Получим доступ к загруженному файлу из модели:

pythonfrom myapp.models import UploadedFile

# Get document
doc = UploadedFile.objects.get(name='Report')

# Access file properties
print(f"File path: {doc.file.path}")
print(f"File URL: {doc.file.url}")
print(f"File name: {doc.file.name}")
print(f"File size: {doc.file.size} bytes")

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

python"File path: /media/uploads/report.pdf"
"File URL: /media/uploads/report.pdf"
"File name: report.pdf"
"File size: 102400 bytes"

Пример

Используем динамическую генерацию пути с помощью функции:

pythonfrom django.db import models
import os

def user_directory_path(instance, filename):
  # File will be uploaded to MEDIA_ROOT/user_<id>/<filename>
  return f'user_{instance.user.id}/{filename}'

class UserFile(models.Model):
  user = models.ForeignKey('auth.User', on_delete=models.CASCADE)
  title = models.CharField(max_length=100)
  file = models.FileField(upload_to=user_directory_path)

  def __str__(self):
    return self.title

Пример

Проверим существование файла и удалим его:

pythonfrom myapp.models import UploadedFile

# Get document
doc = UploadedFile.objects.get(name='Report')

# Check if file exists
if doc.file:
  print("File exists")
  # Delete file from filesystem
  doc.file.delete(save=True)
  print("File deleted")

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

python"File exists"
"File deleted"

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

  • поле ImageField,
    которое является специализацией для изображений
  • поле FilePathField,
    которое хранит путь к файлу в файловой системе
  • поле BinaryField,
    которое хранит бинарные данные в базе данных
  • метод save,
    который сохраняет экземпляр модели с файлом