Не разрешено вызывать async для функции, преобразованной с помощью sync_to_async()
У меня проблемы с sync_to_async. Я получаю ошибку You cannot call this from an async context - use a thread or sync_to_async. в операторе печати, хотя я использовал sync_to_async для преобразования функции async. Если я делаю print(type(masters)) вместо этого, я получаю QuerySet в качестве типа. Может быть, я что-то упускаю? Я не смог найти этот конкретный случай в документации.
Вот мой код:
import discord
from discord.ext import commands
from asgiref.sync import sync_to_async
class Bot(commands.Bot):
# ...
async def on_message(self, msg):
masters = await sync_to_async(self.subject.masters)()
print(masters)
Вот функция masters(), из которой я пытаюсь получить результаты:
from django.db import models
class Subject(models.Model):
# ...
def masters(self):
from .subjectmaster import SubjectMaster
return SubjectMaster.objects.filter(subject=self)
Ваш QuerySet не выполняется до тех пор, пока он не будет напечатан, а вы печатаете вне функции sync_to_async. Вам необходимо оценить QuerySet в вашем методе
class Subject(models.Model):
def masters(self):
from .subjectmaster import SubjectMaster
# Force evaluation by converting to a list
return list(SubjectMaster.objects.filter(subject=self))
Вариант, если вы не хотите возвращать список из метода masters - это выполнить sync_to_async на функции list и передать ей ваш набор запросов
masters = await sync_to_async(list)(self.subject.masters())