Как уже упоминалось, objects
— это менеджер по умолчанию для каждой модели. Он получает объекты из базы данных. Но можно определять и собственные менеджеры для моделей. Попробуем создать собственный менеджер для получения постов со статусом published
.
Их можно добавить двумя способами: добавив дополнительные методы менеджера или изменив оригинальные. Первый предоставляет API QuerySet, такие как Post.objects.my_manager()
, а второй — Post.my_manager.all()
. Менеджер позволит получать посты с помощью Post.published.all()
.
Отредактируйте файл models.py
приложения blog
для добавления кастомного менеджера:
class PublishedManager(models.Manager):
def get_queryset(self):
return super(PublishedManager,
self).get_queryset()\
.filter(status='published')
class Post(models.Model):
# ...
objects = models.Manager() # Менеджер по умолчанию
published = PublishedManager() # Собственный менеджер
Метод менеджера get_queryset()
возвращает QuerySet, который и будет исполнен. Перезапишем его, чтобы включить кастомный фильтр в финальный QuerySet. Кастомный менеджер уже определен и добавлен к модели Post
; теперь его можно использовать и для осуществления запросов. Проверим.
Запустите сервер разработки с помощью этой команды:
python manage.py shell
Теперь вы можете получить все посты, названия которых начинаются с Who
:
Post.published.filter(title__startswith='Who')