Когда вы копаете, как работает Django, вы можете узнать несколько интересных вещей. Глядя на предоставленное описание операций с базой данных в Джангу, мы видим, что термин Менеджер
появляется более одного раза. Менеджер – это интерфейс, через который предоставляются все операции запросов для ваших моделей. По крайней мере, один из этих интерфейсов существует для каждой модели, которую вы создаете. Сегодня мы узнаем, как создать нашего собственного пользовательского менеджера, который может быть полезен в реальном жизненном сценарии!
Создание пользовательского менеджера
Создание пользовательского менеджера позволит нам изменить поведение запроса, которое попадает в базу данных. В этом примере мы будем кодировать функциональность, которая вернет только Статьи
У этого есть дата публикации ниже текущего времени. Использование этого интерфейса отличный, потому что вся фильтрация будет выполнена на уровне базы данных вместо памяти приложения.
Давайте представим, что у нас есть django Блог
Приложение, которое имеет следующее Статья
модель:
# blog/models.py from django.db import models from django.utils import timezone class Article(db.Model): title = models.CharField(max_length=60) body = models.TextField() pub_date = models.DateTimeField(default=timezone.now)
pub_date
Поле будет нашим фильтром. Мы могли бы создать некоторые фильтрацию на наших взглядах, но это не нужно! Давайте создадим пользовательский Издалманагеру
класс следующим образом:
# blog/managers.py from django.utils import timezone from django.db import models class PublishedManager(models.Manager): def get_queryset(self): return super.get_queryset().filter( pub_date__lte=timezone.now(), )
Мы можем увидеть две вещи в фрагменте выше:
- Мы объявляем новый класс
Издалманагеру
что наследует отмодели. Менеджер
С Мы переопределяем
Manager.get_QuerySet ()
Способ с:- Фильтр
pub_date
быть ниже или равно текущим времени.
- Фильтр
Теперь, что у нас есть созданный простой менеджер, мы можем обновить нашу модель для его использования. Настало время изменить нашу модель следующим образом:
# blog/models.py from django.db import models from django.utils import timezone from blog.managers import PublishedManager class Article(db.Model): title = models.CharField(max_length=60) body = models.TextField() pub_date = models.DateTimeField(default=timezone.now) objects = models.Manager() pub_objects = PublishedManager()
Теперь мы можем извлечь наши модели объектов следующим образом:
Article.objects.all() # Will return all Article objects in the db. Article.pub_objects.all() # Will return only articles that should be published!
Идеально! 🤩.
Оригинал: “https://dev.to/lukzmu/investigating-the-django-model-manager-2d34”