Как заставить переменные шаблона Django работать async?
Пытаюсь применить подход Async к существующему проекту Django, при обновлении представлений возникает такая ошибка: django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
views.py
@sync_to_async
def get_educations():
return Education.objects.filter(highlight=True).order_by("-order")
async def home(request):
return render(request, "home.html", {
"educations": await get_educations(),
})
home.html
<section class="d-flex flex-column">
<h3 class="section">Education</h3>
{% for education in educations %}
{% include "preview_education.html" %}
{% endfor %}
Пробуем с return [Education.objects.first()]
работает хорошо.
Есть идеи, как решить эту проблему?
Решением является приведение Django Queryset к списку и использование select_related
с отношениями модели.
views.py:
@sync_to_async
def get_educations():
return list(
Education.objects.filter(
highlight=True
)
.select_related('organization')
.order_by("-order")
)
async def home(request):
return render(request, "home.html", {
"educations": await get_educations()
}
home.html:
<section class="d-flex flex-column">
<h3 class="section">Education</h3>
{% for education in educations %}
<article class="element">
<h4>{{ education.name }}</h4>
<p>{{ education.organization }}</p>
<p>{{ education.place }}</p>
<p>{{ education.duration }}</p>
</article>
{% endfor %}
</section>