# Запуск 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 для QuerySet
Task.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)
__isnull
IS NULL / IS NOT NULL
filter(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)