将数据从 Django Channels 消费者保存到数据库

Save data to database from Django Channels consumer

我很难从 Django 频道消费者编辑数据库条目,这是涉及的代码片段:

class TestConsumer(AsyncJsonWebsocketConsumer):

    async def websocket_connect(self, event):
        ...
        key_query.active_connections = 2
        key_query.save()
        ...

由于我使用的是异步消费者,这会给我以下错误:

You cannot call this from an async context - use a thread or sync_to_async.

我如何从异步消费者执行此操作?也许使用 @database_sync_to_async?任何建议都将不胜感激!

在 WS 的异步版本中,您还应该将数据库访问转换为异步,因为它通常在同步模式下工作(我指的是数据库查询)。所以你应该通过方法装饰器或其他提到的方式来改变它 here.

解决这个问题的一种方法是使用如下方法和装饰器:

from channels.db import database_sync_to_async

@database_sync_to_async  # a method that goes in your TestConsumer class
def update_key_query(self):
    key_query = some_obj
    key_query.active_connections = 2
    key_query.save()

然后在需要时使用它,如下所示:

async def websocket_connect(self, event):
        ...
        await self.update_key_query()
        ...