Как получить атрибут внешнего ключа (и атрибут "многие ко многим") экземпляра модели в Django в асинхронных запросах?

В асинхронных запросах я хочу получить внешний ключ и многие-ко-многим атрибуты экземпляра модели. В простом примере я хочу вывести university и courses для всех экземпляров модели Student.

models.py:

from django.db import models


class University(models.Model):
    name = models.CharField(max_length=64)


class Course(models.Model):
    name = models.CharField(max_length=64)


class Student(models.Model):
    name = models.CharField(max_length=64)
    university = models.ForeignKey(to=University, on_delete=models.CASCADE)
    courses = models.ManyToManyField(to=Course)

когда я использую этот код (в django 4.1):

async for student in Student.objects.all():
    print(student.university)
    print(student.courses)

Я получаю следующую ошибку:

django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.

Как я могу исправить эту ошибку?

Этот метод я использовал для получения внешнего ключа и атрибутов "многие ко многим" (для django 4.1 или выше).

async def main():
    async for student in Student.objects.all():

        print(student.name)

        university = await University.objects.aget(id=student.university_id)
        print(university.name)

        async for course in student.courses.all():
            print(course.name)


asyncio.run(main())

Чтобы разрешить доступ к объекту внешнего поля, находясь в асинхронном цикле for, выполните запрос с помощью метода "select_related()"

Пример поля внешнего ключа (Django 4.1):

async def main():
    async for student in Student.objects.select_related('university'):
        print(student.university.name)


asyncio.run(main())
Вернуться на верх