Django каналы получают данные из базы данных и отправляют их через вебсокет

error:

    File "/Users/soubhagyapradhan/Desktop/upwork/polyverse/polyverse_api/env/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1173, in execute_sql
        cursor = self.connection.cursor()
    File "/Users/soubhagyapradhan/Desktop/upwork/polyverse/polyverse_api/env/lib/python3.8/site-packages/django/utils/asyncio.py", line 24, in inner
        raise SynchronousOnlyOperation(message)
    django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
    WebSocket DISCONNECT /ws/test/ [127.0.0.1:63954]

comsumer.py

import json
from channels.generic.websocket import AsyncWebsocketConsumer
from random import randint
from api.models import Asset

class WSConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()
        res = list(Asset.objects.filter(id=56).values('token_id'))
        await self.send(json.dumps(res))
        

        

вот код, который я использую для websocket. здесь Я получаю данные из базы данных, но получаю вышеуказанную ошибку

пожалуйста, посмотрите, в чем будет заключаться ошибка?

Думаю, вам нужно database_sync_async вот так:

class WSConsumer(AsyncWebsocketConsumer):
    # rest of the code
    res = await database_sync_to_async(self.get_asset(56))()
    # rest of the code

    def get_asset(self, id):
       return list(Asset.objects.filter(id=id).values('token_id'))

Я считаю, что это потому, что Django ORM является синхронным.

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