Урок 27. Практикум 6: Агрегация, сортировка, временные метки и срезы
⚡ Кратко: Практикум 6 — продвинутые ORM-запросы
15 практических задач на четыре темы Django ORM: агрегация (Sum, Avg, Min, Max, Count, ExpressionWrapper), сортировка order_by, фильтрация по временным меткам и срезы QuerySet. Модели: Product, Category, Supplier, ProductDetail, Order, OrderItem, Customer, Address.
- Агрегация (8 задач): Sum(F*F), Avg, Min/Max, Count, ExpressionWrapper(DurationField), values().annotate()
- order_by (4 задачи): сортировка по цене, annotate+order_by, многополевая сортировка, Count+order_by
- Временные метки (1 задача): timezone.now() - timedelta(days=30), filter(__gte=)
- Срезы (2 задачи): QuerySet[:5], order_by('-price')[:10]
Топ-3 ошибки: 1) Забыть output_field=fields.DurationField() в ExpressionWrapper. 2) Путать aggregate() и annotate(). 3) Пробовать применить срез к QuerySet после order_by('-price') без обёртки в список.
📖 О чём этот урок
Урок 27 — практикум 6 по Django ORM. Задачи взяты из лекции «Django Practicum 6». Новый теоретический материал не вводится — только практика на моделях интернет-магазина (Product, Category, Supplier, Order, OrderItem, Customer, Address, ProductDetail).
Если нужно освежить теорию — загляни в Урок 26 (ORM ч.2 + основы DRF).
Что закрепляем
- Агрегация:
Sum(F('price') * F('quantity')),Avg,Min,Max,Count - Группировка:
values('category__name').annotate(...) - Вычисляемые поля:
ExpressionWrapper(F('expiration_date') - F('manufacturing_date'), output_field=fields.DurationField()) - Сортировка:
order_by('-price'), многополевая сортировка, сортировка по аннотированному полю - Временные метки:
timezone.now() - timezone.timedelta(days=30) - Срезы QuerySet:
[:5],[:10]— аналог SQL LIMIT
📚 Что повторить перед изучением
- ← Урок 26: ORM запросы ч.2 + основы DRF
- Django shell:
python manage.py shell - QuerySet:
filter(),values(),annotate(),aggregate() - F-объекты: арифметика на уровне базы данных
- Модели store:
Product,Category,Order,OrderItem,Customer
🎯 Что изучать дальше
- → Урок 28: Мини-проект Agile (DRF)
- DRF: ViewSet, Router, Permissions
- DRF: Пагинация —
PageNumberPagination - Сложные подзапросы:
Subquery,OuterRef