Когда вы копаете, как работает 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”