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

使用GraphQL变量获取指定地点旅游预订列表时遇事件循环错误

问题分析与解决

错误根源

  1. ORM查询返回类型不匹配:你的resolve_reservations_by_place方法用了Reservation.objects.get(place=place),但get()仅返回单个Reservation对象,而字段定义的是graphene.List(ReservationType)(列表类型),类型不匹配会触发异常,这是引发后续事件循环错误的直接诱因。
  2. 异步线程缺失事件循环:错误提示“There is no current event loop in thread 'Thread-2'”说明后端运行在异步环境(如异步Django、FastAPI搭配异步Graphene),但子线程执行ORM查询时未绑定事件循环。

修复方案

1. 修正ORM查询逻辑

把get()替换为filter(),返回符合条件的对象列表,与字段类型匹配:

def resolve_reservations_by_place(root, info, place, **kwargs):
     return Reservation.objects.filter(place=place)
  • filter()返回的QuerySet是可迭代列表,能被graphene.List(ReservationType)正常序列化。

2. 解决事件循环问题

如果项目基于异步框架,需使用异步ORM方法保持一致性:

async def resolve_reservations_by_place(root, info, place, **kwargs):
     return await Reservation.objects.filter(place=place).all()

若必须在同步线程执行异步操作,可手动创建并绑定事件循环(不推荐,仅作应急):

import asyncio

def resolve_reservations_by_place(root, info, place, **kwargs):
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    result = loop.run_until_complete(Reservation.objects.filter(place=place).all())
    loop.close()
    return result

3. 确认字段命名匹配

你的GraphQL查询用reservationsByPlace,后端定义reservations_by_place,Graphene默认会将下划线命名转为驼峰,这部分无需修改。

验证修改

重新启动服务后执行原查询:

query GetReservationByTour($tour_place: String!) {
  reservationsByPlace(place: $tour_place) {
   id
   tour {
    id
    place
   }
 }
}

传入合法地点变量即可返回对应预订列表,不再触发事件循环错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:45:25