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 для отдельных операций может привести к увеличению производительности из-за переключения контекста между синхронным и асинхронным выполнением.

Вернуться на верх