Django База [2023]: Методы QuerySet в Django ORM #13
Django

Django База [2023]: Методы QuerySet в Django ORM #13

Razilator

Мы рассмотрим методы QuerySet в Django ORM. QuerySet — это набор объектов из базы данных, который может использовать фильтры для ограничения, поиска, получения результатов.

Каждая созданная модель в Django имеет менеджер по умолчанию. Называется этот менеджер objects. С помощью менеджера вы можете управлять моделью, перебирая данные.

Когда исполняется qs запрос

  • При первой итерации по QuerySet.
  • При получении среза, например Article.objects.all()[:5]
  • При сериализации или кэшировании объектов.
  • При вызове repr() или len().
  • При прямом вызове list().
  • При проверке QuerySet в других выражениях, например bool(), or, and или if.

Методы Django ORM

Метод менеджера all()

Для получения всех объектов из таблицы модели Article, необходимо использовать метод all() в менеджере модели.

Пример:

~views.py
qs = Article.objects.all()

Данный метод вернет QuerySet, который возвращает все объекты базы данных. Примечание: Данный запрос ещё не выполнен, так QuerySet в Django ленивый (lazy). Запрос будет работать только в том случае, если он будет использоваван. Такое поведение делает инструмент чрезвычайно эффективным.

Если вы не храните QuerySet в переменной, а записываете его непосредственно в оболочке Python, оператор SQL в QuerySet будет выполняться автоматически, потому что команда используется без переменной:

Shell
Article.objects.all()

Метод менеджера get()

Получить один объект по заданному полю можно через метод менеджера get(), например:

Shell
Article.objects.get(slug="test-article")

Метод менеджера filter()

Чтобы отфильтровать QuerySet, вы можете использовать метод менеджера filter(). Например, вы можете получить все статьи за 2022 год с помощью следующего запроса:

Shell
Article.objects.filter(time_create__year=2022)

Также мы можем фильтровать и по нескольким полям одновременно, например мы хотим за 2022 год найти статьи определенного автора:

Shell
Article.objects.filter(time_create__year=2022, author__username='Raphael')

У метода filter() большое количество возможностей фильтрации, более подробно Вы можете ознакомиться в документации

Метод менеджера exclude()

Вы можете исключить определенные результаты из своего запроса, используя метод менеджера exclude(). Например, вы можете загрузить все сообщения 2022 года, которые не начинаются со слова "Django":

Shell
Article.objects.filter(time_create__year=2022).exclude(title__startswith='Django')

Метод менеджера order_by()

Результаты qs можно отсортировать по полям с помощью метода менеджера order_by(). Например, Вы можете отсортировать все объекты по дате публикации от новых к старым:

Примечание:

Чтобы разместить элементы по убыванию необходимо использовать минус в качестве префикса (от новых к старым):

Shell
Article.objects.order_by('-time_create')

Или наоборот, от старых к новым:

Shell
Article.objects.order_by('time_create')

Метод менеджера delete()

Если Вам необходимо удалить объект из базы данных, это можно сделать с помощью метода менеджера delete(), например:

Shell
first_article = Article.objects.all().first()
first_article.delete()

В этом случае мы использовали переменную, так как нам необходимо до удаления получить объект, который мы хотим удалить. Я использовал метод first() для получения первого объекта из всего QuerySet запроса со статьями, а после воспользовался методом менеджера delete()

Примечание:

Обратите внимание, что удаление объектов также удалит все зависимые отношения для объектов ForeignKey, для которых в CASCADE определено параметром on_delete.

;