Блог на Django #13: Создание менеджеров модели

172

Как уже упоминалось, 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')

Тест на знание python

Какой будет результат выполнения этого кода?
Какая функция разворачивает список задом наперед?
Что выведет этот код?
Что выведет этот код?
Какой будет результат выполнения этого кода?
Викиум