🔖 Справочник: QuerySet API Django 5.x

К оглавлению урока

⚡ Быстрый поиск

Ключевые методы: all() filter() exclude() get() create() save() first() last() count() exists() values()

Lookups: __exact __iexact __contains __icontains __startswith __endswith __in __gt __gte __lt __lte __isnull __range

Менеджер моделей и Django Shell

КомандаОписание
python manage.py shellЗапустить Django Shell
from app.models import ModelИмпортировать модель в shell
Model.objectsДоступ к менеджеру модели

Создание записей

МетодОписаниеПример
.create(**kwargs) Создать и сохранить запись за 1 шаг Book.objects.create(title="...", author="...")
.save() Сохранить объект в БД (INSERT или UPDATE) book = Book(...); book.save()
.bulk_create([...]) Создать несколько записей одним SQL-запросом Book.objects.bulk_create([Book(...), Book(...)])

Чтение записей

МетодВозвращаетОписание
.all()QuerySetВсе записи таблицы
.filter(**kwargs)QuerySetЗаписи, соответствующие условию
.exclude(**kwargs)QuerySetЗаписи, НЕ соответствующие условию
.get(**kwargs)Объект моделиРовно одна запись; бросает исключение при 0 или >1
.first()Объект или NoneПервая запись QuerySet
.last()Объект или NoneПоследняя запись QuerySet
.count()intКоличество записей (SELECT COUNT)
.exists()boolTrue если есть хотя бы одна запись
.values(*fields)QuerySet[dict]Записи как словари с указанными полями
.values_list(*fields)QuerySet[tuple]Записи как кортежи
.order_by(*fields)QuerySetСортировка; -field для убывания
.distinct()QuerySetУбрать дублирующиеся строки (SELECT DISTINCT)

Lookups — условия фильтрации

LookupОписаниеПример
__exactТочное совпадение (регистрозависимо)title__exact="Gatsby"
__iexactТочное совпадение (без учёта регистра)title__iexact="gatsby"
__containsСодержит подстроку (регистрозависимо)title__contains="Gatsby"
__icontainsСодержит подстроку (без учёта регистра)title__icontains="gatsby"
__startswithНачинается с (регистрозависимо)title__startswith="The"
__istartswithНачинается с (без учёта регистра)title__istartswith="the"
__endswithЗаканчивается на (регистрозависимо)title__endswith="Gatsby"
__iendswithЗаканчивается на (без учёта регистра)title__iendswith="gatsby"
__inЗначение входит в списокid__in=[1, 2, 3]
__gtБольше чемprice__gt=10
__gteБольше или равноprice__gte=10
__ltМеньше чемprice__lt=50
__lteМеньше или равноprice__lte=50
__isnullЗначение IS NULL (True) или IS NOT NULL (False)price__isnull=True
__rangeЗначение в диапазоне (включая границы, BETWEEN)published_date__range=["2020-01-01","2023-12-31"]

Класс Q — логические операторы

from django.db.models import Q

# AND (&) — оба условия истинны
filter(Q(a=1) & Q(b=2))

# OR (|) — хотя бы одно условие истинно
filter(Q(a=1) | Q(b=2))

# NOT (~) — условие ложно
filter(~Q(a=1))

# Комбинация
filter((Q(a=1) | Q(b=2)) & ~Q(c=3))

Исключения

ИсключениеКогда возникаетИмпорт
Model.DoesNotExist get() не нашёл записи Встроен в модель; также from django.core.exceptions import ObjectDoesNotExist
MultipleObjectsReturned get() нашёл более одной записи from django.core.exceptions import MultipleObjectsReturned
FieldError Несуществующее поле в filter/lookup from django.core.exceptions import FieldError