Ответ
Пользовательский менеджер модели (Custom Model Manager) в Django — это класс, наследуемый от django.db.models.Manager
, который позволяет добавить или изменить стандартное поведение методов, работающих с таблицей базы данных (например, all()
, filter()
, create()
).
Основные сценарии использования:
- Инкапсуляция логики: Скрытие сложных или часто повторяющихся запросов в одном методе.
- Изменение
QuerySet
по умолчанию: Например, для автоматического исключения "удаленных" записей из всех выборок. - Добавление методов уровня таблицы: Создание методов, которые не относятся к конкретному объекту, а ко всей таблице (например,
Product.objects.create_with_sku(...)
).
Пример: Менеджер для "активных" публикаций
from django.db import models
# 1. Определяем пользовательский менеджер
class PublishedManager(models.Manager):
def get_queryset(self):
# Переопределяем базовый QuerySet, чтобы он всегда фильтровал по статусу 'published'
return super().get_queryset().filter(status='published')
# 2. Применяем его к модели
class Post(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
status = models.CharField(max_length=10, choices=[('draft', 'Draft'), ('published', 'Published')])
# Стандартный менеджер, чтобы иметь доступ ко всем записям
objects = models.Manager()
# Наш новый менеджер
published = PublishedManager()
def __str__(self):
return self.title
Использование:
# Получить все посты, включая черновики
all_posts = Post.objects.all()
# Получить только опубликованные посты
published_posts = Post.published.all()
Важное замечание: Если вы определяете пользовательский менеджер, Django перестает автоматически создавать стандартный менеджер objects
. Поэтому рекомендуется явно добавлять objects = models.Manager()
в модель, чтобы сохранить доступ к стандартному поведению.