不允许对使用 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())