You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Channels对接WebSocket时接收数据模型字段缺失问题求助

问题修复方案

  • 首先修复重复JSON序列化问题:你在views.py中提前对data、sender、receiver、created四个字段做了json.dumps()序列化转字符串,后续在consumer.py中又对整个返回字典做了一次全局序列化,双重序列化会导致字段被转义,容易出现解析异常、字段看似缺失的问题。
  • 其次加字段容错逻辑:原代码直接用event['key']的方式取值,如果某字段发送时缺失会直接抛出KeyError,导致后续代码不执行、无返回结果。
  • 最后提前校验数据源:在发送事件到Channels层之前打印相关字段值,确认Serializer输出、关联查询结果本身没有缺失。

修改后的views.py代码

async_to_sync(layer.group_send)(("chat_" + str(channel_name)), {
    'type': 'chat_message',
    'method': 'POST',
    'model': 'social',
    'data': serializers.data,
    'description': 'new post',
    'sender': LikeSerializer(request.user, many=False).data,
    'receiver': sorted(my_profile.profile_followers.all().values_list('id', flat=True)),
    'created': timezone.now().isoformat(),
    'seen': None
})

修改后的consumer.py代码

# Receive message from room group
async def chat_message(self, event):
    method = event.get('method')
    model = event.get('model')
    data = event.get('data')
    description = event.get('description')
    receiver = event.get('receiver')
    sender = event.get('sender')
    created = event.get('created')
    seen = event.get('seen')

    # Send message to WebSocket
    await self.send(text_data=json.dumps({
        'method': method,
        'model': model,
        'data': data,
        'description': description,
        'receiver': receiver,
        'sender': sender,
        'created': created,
        'seen': seen,
    }))

如果修复后仍有字段缺失,检查Postman是否以JSON格式解析返回结果,排除文本解析导致的字段展示异常。

内容的提问来源于stack exchange,提问作者Zaid Kallel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:24:03