Django База [2023]: Методы QuerySet в Django ORM #13
Мы рассмотрим методы QuerySet в Django ORM. QuerySet — это набор объектов из базы данных, который может использовать фильтры для ограничения, поиска, получения результатов.
Если вы хотите выразить благодарность автору сайта, статей и курса по Django, вы можете сделать это по ссылке ниже:
Каждая созданная модель в Django имеет менеджер по умолчанию. Называется этот менеджер objects. С помощью менеджера вы можете управлять моделью, перебирая данные.
Когда исполняется qs запрос
- При первой итерации по QuerySet.
- При получении среза, например
Article.objects.all()[:5]
- При сериализации или кэшировании объектов.
- При вызове
repr()
илиlen()
. - При прямом вызове
list()
. - При проверке QuerySet в других выражениях, например
bool()
,or
,and
илиif
.
Методы Django ORM
Метод менеджера all()
Для получения всех объектов из таблицы модели Article, необходимо использовать метод all()
в менеджере модели.
Пример:
qs = Article.objects.all()
Данный метод вернет QuerySet, который возвращает все объекты базы данных. Примечание: Данный запрос ещё не выполнен, так QuerySet в Django ленивый (lazy). Запрос будет работать только в том случае, если он будет использоваван. Такое поведение делает инструмент чрезвычайно эффективным.
Если вы не храните QuerySet в переменной, а записываете его непосредственно в оболочке Python, оператор SQL в QuerySet будет выполняться автоматически, потому что команда используется без переменной:
Article.objects.all()
Метод менеджера get()
Получить один объект по заданному полю можно через метод менеджера get()
, например:
Article.objects.get(slug="test-article")
Метод менеджера filter()
Чтобы отфильтровать QuerySet, вы можете использовать метод менеджера filter()
. Например, вы можете получить все статьи за 2022 год с помощью следующего запроса:
Article.objects.filter(time_create__year=2022)
Также мы можем фильтровать и по нескольким полям одновременно, например мы хотим за 2022 год найти статьи определенного автора:
Article.objects.filter(time_create__year=2022, author__username='Raphael')
У метода filter()
большое количество возможностей фильтрации, более подробно Вы можете ознакомиться в документации
Метод менеджера exclude()
Вы можете исключить определенные результаты из своего запроса, используя метод менеджера exclude()
. Например, вы можете загрузить все сообщения 2022 года, которые не начинаются со слова "Django":
Article.objects.filter(time_create__year=2022).exclude(title__startswith='Django')
Метод менеджера order_by()
Результаты qs можно отсортировать по полям с помощью метода менеджера order_by()
. Например, Вы можете отсортировать все объекты по дате публикации от новых к старым:
Примечание:
Чтобы разместить элементы по убыванию необходимо использовать минус в качестве префикса (от новых к старым):
Article.objects.order_by('-time_create')
Или наоборот, от старых к новым:
Article.objects.order_by('time_create')
Метод менеджера delete()
Если Вам необходимо удалить объект из базы данных, это можно сделать с помощью метода менеджера delete()
, например:
first_article = Article.objects.all().first()
first_article.delete()
В этом случае мы использовали переменную, так как нам необходимо до удаления получить объект, который мы хотим удалить. Я использовал метод first()
для получения первого объекта из всего QuerySet запроса со статьями, а после воспользовался методом менеджера delete()
Примечание:
Обратите внимание, что удаление объектов также удалит все зависимые отношения для объектов ForeignKey, для которых в CASCADE
определено параметром on_delete
.