Как использовать sync_to_async() в шаблоне Django?

Я пытаюсь превратить коды опросов из учебника Django в async с помощью uvicorn async view. ORM запрос работает с async представлением путем обертывания в sync_to_async() как таковой.

question = await sync_to_async(Question.objects.get, thread_sensitive=True)(pk=question_id)

Но я понятия не имею, как применить sync_to_async или thread внутри шаблонов Django.

Этот код не работает, говоря "You cannot call this from an async context - use a thread or sync_to_async." Или есть другой способ обойти это?

{% for choice in question.choice_set.all %}

Я использую Python 3.10, Django 4.0.4 и uvicorn 0.17.6

Я нашел несколько решений для этого:

Это небезопасно. В вашем settings.py добавьте:

import os
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"

Или получить свой объект Question в отдельной функции:

@sync_to_async
def get_question(question_id):
    return get_object_or_404(Question, pk=question_id)

question = await get_question(pk=question_id)

Или без разделения (работает с Django 4.1+):

question = await Question.objects.aget(id=question_id)
Вернуться на верх