Ответ
В Django Manager
— это интерфейс, через который модели Django выполняют операции с базой данных. Каждая модель имеет как минимум один менеджер, по умолчанию он называется objects
.
Основная задача менеджера — предоставлять методы для получения объектов из базы данных. Результатом работы таких методов обычно является QuerySet
.
Зачем нужны кастомные менеджеры?
Пользовательские менеджеры создают для двух основных целей:
- Добавление новых методов: Для инкапсуляции часто используемых запросов на уровне модели.
- Изменение стандартного
QuerySet
: Для постоянной фильтрации объектов, возвращаемых менеджером.
Пример кастомного менеджера
Допустим, у нас есть модель Post
и мы часто хотим получать только опубликованные посты.
from django.db import models
from django.utils import timezone
# 1. Создаем кастомный менеджер
class PublishedManager(models.Manager):
def get_queryset(self):
# Переопределяем базовый QuerySet, чтобы он всегда фильтровал по статусу и дате
return super().get_queryset().filter(
status='published',
publish__lte=timezone.now()
)
class Post(models.Model):
STATUS_CHOICES = (
('draft', 'Draft'),
('published', 'Published'),
)
title = models.CharField(max_length=250)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
publish = models.DateTimeField(default=timezone.now)
# 2. Подключаем менеджеры к модели
objects = models.Manager() # Стандартный менеджер
published = PublishedManager() # Наш кастомный менеджер
def __str__(self):
return self.title
Использование
Теперь вместо сложных фильтров в коде можно использовать наш новый менеджер:
# Получить ВСЕ посты, включая черновики
all_posts = Post.objects.all()
# Получить ТОЛЬКО опубликованные посты
# Это короче, чище и менее подвержено ошибкам, чем Post.objects.filter(status='published', ...)
published_posts = Post.published.all()