Similar presentations:
DRF - Модели (2)
1. Django REST Framework
print(“Создание модельных менеджеров”)2. Создание модельных менеджеров
Менеджер модели (Model Manager) — это интерфейс между моделью Django ибазой данных.Каждая модель имеет как минимум один менеджер, обычно это
objects, который предоставляет методы для работы с базой данных (например,
all(), filter(), get(), и т.д.).
Book.objects.all()
Book.objects.filter(author='Толстой')
3. Создание модельных менеджеров
Зачем нужны кастомные менеджерыИногда стандартных возможностей менеджера objects недостаточно. Тогда
создаются кастомные менеджеры, которые позволяют:
Инкапсулировать повторяющиеся фильтры и логику запросов
Делать код вьюшек и сериализаторов более чистым и лаконичным
Повышать читаемость и тестируемость кода
Реализовывать бизнес-логику «на уровне модели», а не во вьюшках
4. Создание модельных менеджеров
Пример: Если у вас есть модель Article с флагом is_published, вы можетевынести фильтрацию опубликованных записей в менеджер.
Чтобы создать менеджер, достаточно унаследоваться от models.Manager и
переопределить метод get_queryset().
from django.db import models
class PublishedManager(models.Manager):
def get_queryset(self):
# Возвращаем только опубликованные статьи
return super().get_queryset().filter(is_published=True)
5. Создание модельных менеджеров
Теперь в модели можно использовать два менеджера: стандартный и кастомный.class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
is_published = models.BooleanField(default=False)
objects = models.Manager()
published = PublishedManager()
# стандартный менеджер
# кастомный
6. Создание модельных менеджеров
Теперь можно обращаться к обоим менеджерам:Article.objects.all()
Article.published.all()
# Все статьи
# Только опубликованные
Это особенно полезно, если в проекте часто нужно фильтровать по признаку
публикации — логика не дублируется в разных местах.
Помимо get_queryset(), в менеджере можно определять собственные методы,
которые будут возвращать кастомные QuerySet или отдельные данные.
7. Создание модельных менеджеров
class OrderManager(models.Manager):def recent(self):
return self.get_queryset().order_by('-created_at')[:10]
def by_user(self, user):
return self.get_queryset().filter(user=user)
Использование:
Order.objects.recent()
Order.objects.by_user(request.user)