Долгожданный запрос на асинхронный интерфейс с ORM Queryset был включен в основную ветку Django 4.1.
Основная команда Django постепенно добавляла поддержку асинхронности в фреймворк. Асинхронные представления и промежуточное ПО были частью Django версии 3.1, и с последними изменениями Django ORM теперь сможет выполнять асинхронные запросы ORM с некоторыми исключениями.
С предстоящим выпуском Django больше не нужно оборачивать запросы в sync_to_async.
results = await sync_to_async(Blog.objects.get, thread_sensitive=True)(pk=123)
А теперь вы можете писать асинхронные запросы следующим образом
results = await Blog.objects.aget(pk=123)
Примечание:
Обратите внимание, что на этом этапе базовые операции базы данных остаются синхронными, в то время как продолжается работа по реализации асинхронной поддержки в компиляторе SQL и интеграции драйверов асинхронной базы данных. Новый интерфейс набора асинхронных запросов теперь инкапсулирует необходимые вам операции sync_to_async() и позволяет вашему коду использовать преимущества асинхронной поддержки ORM по мере ее развития.
Не так давно на официальном форуме Django состоялось обсуждение соглашения об именах для асинхронных вариантов, где основные участники проголосовали за варианты с префиксом «a».
В том же PR Эндрю упомянул, что пройдет некоторое время, прежде чем мы сможем использовать асинхронно-совместимые драйверы, такие как Psycopg3.
Тем не менее, это все еще большая победа для сообщества Django. ORM, несомненно, является одной из самых сложных частей Django, и теперь он способен выполнять асинхронные запросы с новыми API-интерфейсами QuerySet без каких-либо серьезных изменений, несовместимых с предыдущими версиями!