🔖 Справочник: Django ORM

Шпаргалка по методам и lookups

⚡ Самые нужные команды

python manage.py shell
Model.objects.create(field=val)
Model.objects.all()
Model.objects.filter(field=val)
Model.objects.filter(field__icontains='str')
Model.objects.filter(Q(a=1) & Q(b=2))
Model.objects.filter(field__isnull=True)
queryset.update(field=val)
Model.objects.bulk_update(objs, ['field'])
Model.objects.annotate(n=Count('rel'))

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

Shell и импорты

# Запуск Django shell
python manage.py shell

# Типичные импорты для практикума
from management_app.models.tag import Tag
from management_app.models.project import Project, ProjectFile
from management_app.models.task import Task
from django.contrib.auth.models import User
from django.db.models import Q, F, Count
from django.utils import timezone
import datetime

Методы QuerySet Manager

МетодОписаниеПример
all()Все объектыTag.objects.all()
filter(**kwargs)Фильтрация (AND)Task.objects.filter(status='new')
exclude(**kwargs)ИсключениеTask.objects.exclude(status='closed')
get(**kwargs)Один объект (исключение если нет)Tag.objects.get(name='Backend')
first()Первый объектTag.objects.first()
last()Последний объектTag.objects.last()
count()КоличествоTag.objects.count()
exists()True/False наличиеTag.objects.filter(name='X').exists()
create(**kwargs)Создать и сохранитьTag.objects.create(name='QA')
update(**kwargs)SQL UPDATE для QuerySetTask.objects.filter(...).update(status='done')
bulk_update(objs, fields)Массовое обновление спискаTask.objects.bulk_update(tasks, ['status'])
annotate(**expr)Добавить вычисляемое поле.annotate(cnt=Count('project_files'))
distinct()Убрать дублирующиеся строки.filter(...).distinct()

Lookups (суффиксы к именам полей)

LookupОписаниеПример
__exactТочное совпадение (по умолчанию)filter(name__exact='Backend')
__iexactБез учёта регистраfilter(name__iexact='backend')
__containsСодержит подстрокуfilter(name__contains='end')
__icontainsСодержит (без рег.)filter(name__icontains='e')
__gtСтрого большеfilter(date__gt=req_date)
__gteБольше или равноfilter(date__gte=last_week)
__ltСтрого меньшеfilter(date__lt=one_month_ago)
__lteМеньше или равноfilter(due_date__lte=end_of_month)
__isnullIS NULL / IS NOT NULLfilter(assignee__isnull=True)
__inПринадлежит спискуfilter(status__in=['new','open'])
__monthМесяц датыfilter(due_date__month=6)
__yearГод датыfilter(created_date__year=2024)

Q-класс

from django.db.models import Q

# AND — оба условия
Task.objects.filter(Q(status='new') & Q(priority='Urgent'))

# OR — одно из условий
Task.objects.filter(Q(status='new') | Q(priority='Critical'))

# NOT
Task.objects.filter(~Q(tags__name='Q&A'))

# Комбинация
Task.objects.filter(
    (Q(status='new') & Q(priority='Urgent')) | ~Q(tags__name='Q&A')
)

F-класс

from django.db.models import F
from datetime import timedelta

# Сдвинуть due_date на 1 неделю
Task.objects.update(due_date=F('due_date') + timedelta(weeks=1))

# Задачи, чей due_date — следующий месяц после создания
Task.objects.filter(due_date__month=F('created_date__month') + 1)

Агрегация

from django.db.models import Count

# Количество файлов для каждого проекта
Project.objects.annotate(file_count=Count('project_files'))

# Фильтрация по аннотации
Project.objects.annotate(
    file_count=Count('project_files')
).filter(
    Q(date_of_creation__gt=req_date) & Q(file_count__gte=3)
)

ManyToMany

# Добавить тэг к задаче
task.tags.add(tag_object)

# Добавить несколько тэгов
task.tags.add(tag1, tag2)

# Добавить файл к проекту
project.project_files.add(file_obj)

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