Неочевидные возможности 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