Как использовать 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)