不允许对使用 sync_to_async() 转换的函数调用异步
Not allowed to call async on function converted with sync_to_async()
我在使用 sync_to_async 时遇到问题。我在 print 语句中收到 You cannot call this from an async context - use a thread or sync_to_async.
错误,即使我使用 sync_to_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))
一个选项,如果您不希望 return 来自 masters
方法的列表是 运行 sync_to_async
list
函数和将您的查询集传递给它
masters = await sync_to_async(list)(self.subject.masters())
我在使用 sync_to_async 时遇到问题。我在 print 语句中收到 You cannot call this from an async context - use a thread or sync_to_async.
错误,即使我使用 sync_to_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))
一个选项,如果您不希望 return 来自 masters
方法的列表是 运行 sync_to_async
list
函数和将您的查询集传递给它
masters = await sync_to_async(list)(self.subject.masters())