вам нужно деформировать действия базы данных в database_sync_to_async
.
class BackgroundTaskConsumer(AsyncConsumer):
async def create_users(self, message):
number = message['number']
id = message['id']
await database_sync_to_async(UserFactory.create_batch)(number, groups=(id,))
, кажется немного странным, как вы используете database_sync_to_async
причину, по которой вы оборачиваете Функция, которую вы вызываете так, как вы делаете, заключается в том, чтобы убедиться, что она обернута перед вызовом.
in python, если вы делаете
a = c(b())
b()
, вызываемый до c(..)
,
однако database_sync_to_async
необходимо сделать несколько вещей до и после доступа к БД.
обычно в python вы бы используйте для этого with contextManager
, но это не совместимо с преобразованием из async
в sync
.
, поэтому wrapping
ваш UserFactory.create_batch
метод возвращает затем новый метод, который вы можете звоните с create_batch
. Это работает так же, как @decorator