Django Channels:异步上下文中外键及其字段的引用问题
解决Django异步环境中外键访问报错问题
原同步代码:
self.mydatacache['workernr'] = school.objects.get(id=myschool).tf_worker.id
两次异步尝试代码:
第一次:
self.mydatacache['workernr'] = await school.objects.aget(id=myschool).tf_worker.id
第二次:
school_object = await school.objects.aget(id=myschool) tf_worker_object = await school_object.tf_worker self.mydatacache['workernr'] = tf_worker_object.id
报错信息:
You cannot call this from an async context
解决建议
问题核心是Django异步ORM中外键属性的访问逻辑:直接访问school_object.tf_worker属于同步操作,会在异步上下文里触发同步数据库查询,进而报错。要避免使用database_sync_to_async,可以用以下两种方式处理:
- 预取关联对象:在异步查询时用
aselect_related预加载外键关联的数据,后续直接访问属性就不会触发新的同步查询:
school_object = await school.objects.aselect_related('tf_worker').aget(id=myschool) self.mydatacache['workernr'] = school_object.tf_worker.id
- 异步获取关联对象:如果不需要预取所有关联数据,可通过外键的异步查询方法
aget()单独获取:
school_object = await school.objects.aget(id=myschool) tf_worker_object = await school_object.tf_worker.aget() self.mydatacache['workernr'] = tf_worker_object.id
内容的提问来源于stack exchange,提问作者LudgerH
相关产品推荐
相关产品推荐

