Не разрешено вызывать 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())
Вернуться на верх