Неочевидные возможности Django 5х
Как выжать максимум из фреймворка Django - это не только ORM, админка и шаблоны. В пятой версии фреймворк принес несколько мощных, но неочевидных фич, которые могут упростить ваш код. Разбираем на примерах.
1. async в ORM без sync_to_async Раньше для асинхронных запросов к БД требовался sync_to_async. В Django 5 часть методов ORM поддерживает await из коробки: async def get_recent_orders(user_id): orders = awair Order.objects.filter(user_id=user_id).order_by("-created_at")[:5] return list(orders)
Примечание: Полная асинхронность ORM пока в разработке, но базовые запросы уже работают.
2. Генераторы в QuerySet (экономия памяти) Django 5 позволяет использовать генераторы для values_list() и values(), что полезно при работе с большими данными:
def stream_large_dataset(): queryset = Product.objects.values_list("name", "price").iterator(chunk_size=1000) for name, price in queryset: yield f"{name}: {price}\n" #
Использование в Django StreamingHttpResponse response = StreamingHttpResponse(stream_large_dataset())
3. Field.choices с группировкой Теперь choices можно структурировать с помощью grouped_choices: class Ticket(models.Model): class Category(models.TextChoices): BUG = "bug", "Ошибка" FEATURE = "feature", "Фича" class Status(models.TextChoices): OPEN = "open", "Открыт" CLOSED = "closed", "Закрыт"
category = models.CharField(max_length=10, choices=Category.choices) status = models.CharField(max_length=10, choices=Status.choices, grouped_choices={ {"Active": [Status.OPEN], "Archived": [Status.CLOSED], }, )
В форме поля status будут сгруппированы
4. @override_settings с контекстом Теперь можно временно переопределять настройки не только в тестах, но и в обычном коде:
from django.test.utils import override_settings
with override_settings(CACHE_TIMEOUT=3600): data = cache.get("expensive_data") # Использует временные настройки
5. Расширенный QuerySet.explain() Для анализа медленных запросов в Django 5 добавили поддержку форматов вывода (JSON, TEXT): plan = ( User.objects .filter(is_active=True) .explain(format="JSON", analyze=True) ) print(plan) # Детальный план запроса в JSON
6. Кастомные валидаторы для @cache_page Можно кешировать страницы не только по времени, но и по логике:
from django.views.decorators.cache import cache_page def should_cache(request):
return not request.user.is_staff # Не кешируем для админов @cache_page(60 * 15, key_prefix="stories", cache_condition=should_cache) def story_list(request):
... Итог Django 5 - это не только про "еще больше методов в ORM". Это про тонкие оптимизации, которые делают код чище и быстрее. Какие из этих фич вы уже используете? Делитесь в комментариях! #django #webdev #python