Как получить атрибут внешнего ключа (и атрибут "многие ко многим") экземпляра модели в 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())