Django Async Добавление к полю "многие-ко-многим
Я пытаюсь использовать этот кусок кода для обновления поля "многие-ко-многим" в рамках async-функции:
async def get_last_message_id() -> int:
last_message = await Message.objects.all().alast()
if last_message:
await last_message.read_by.aadd(request.user)
return last_message.id if last_message else 0
Однако я получаю следующую ошибку: TypeError: 'async_generator' object is not iterable
Что я делаю не так?
Спасибо!
Проблема связана с вызовом синхронной операции ORM (add
над полем "многие-ко-многим" ) непосредственно из асинхронной функции без использования возможностей асинхронного ORM в Django или правильной адаптации синхронного кода для асинхронного выполнения.
В ORM Django есть определенные асинхронные возможности ( "Поддержка асинхронности¶"), но пока не все части ORM полностью совместимы с асинхронностью.
Учитывая ограничения асинхронного ORM в Django и сообщение об ошибке, которое вы получили при использовании add
без префикса a
(что указывает на попытку выполнить синхронную операцию в асинхронном контексте), решение должно включать использование sync_to_async
обертки из asgiref.sync
для выполнения синхронного кода асинхронно.
from asgiref.sync import sync_to_async
async def get_last_message_id(request) -> int:
last_message = await Message.objects.all().alast()
if last_message:
# Wrap the synchronous add operation in sync_to_async
await sync_to_async(last_message.read_by.add)(request.user)
return last_message.id if last_message else 0
sync_to_async(last_message.read_by.add)(request.user)
оборачивает синхронный вызов метода add
в sync_to_async
: это должно позволить ожидать его внутри асинхронной функции.
Но... использование sync_to_async
для отдельных операций может привести к увеличению производительности из-за переключения контекста между синхронным и асинхронным выполнением.