使用GraphQL变量获取指定地点旅游预订列表时遇事件循环错误
问题分析与解决
错误根源
- ORM查询返回类型不匹配:你的
resolve_reservations_by_place方法用了Reservation.objects.get(place=place),但get()仅返回单个Reservation对象,而字段定义的是graphene.List(ReservationType)(列表类型),类型不匹配会触发异常,这是引发后续事件循环错误的直接诱因。 - 异步线程缺失事件循环:错误提示“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
相关产品推荐
相关产品推荐

