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

在Django异步函数中创建对象时遇SynchronousOnlyOperation错误求助

解决Django异步上下文调用同步ORM的错误

你碰到的SynchronousOnlyOperation错误,核心原因是Django的ORM操作(比如Program.objects.create)是同步实现的,不能直接在异步函数里执行。按照错误提示,有两种可靠的解决方式:

方法1:使用Django官方的sync_to_async(推荐)

Django提供了asgiref.sync模块下的sync_to_async工具,专门用来把同步函数包装成可在异步上下文执行的形式,还会自动处理数据库连接上下文,避免手动管理的麻烦。

修改后的代码:

from asgiref.sync import sync_to_async
import asyncio
from your_app.models import Program  # 替换成你的模型实际所在路径

async def func():
    print("This is async function")
    # 用sync_to_async包装同步ORM操作并await执行
    await sync_to_async(Program.objects.create)(name="New Program")

asyncio.run(func())

方法2:手动用线程池包装

如果不想依赖Django的工具,也可以用Python标准库的线程池,把同步ORM操作放到线程中执行,再通过异步方式等待结果。

修改后的代码:

import asyncio
from concurrent.futures import ThreadPoolExecutor
from your_app.models import Program  # 替换成你的模型实际所在路径

# 创建线程池执行器
executor = ThreadPoolExecutor()

async def func():
    print("This is async function")
    loop = asyncio.get_running_loop()
    # 在线程池中执行同步ORM操作
    await loop.run_in_executor(executor, Program.objects.create, name="New Program")

asyncio.run(func())

注意事项

  • 如果是在独立脚本中运行代码,需要先初始化Django环境:设置DJANGO_SETTINGS_MODULE环境变量,并调用django.setup()
  • sync_to_async是Django官方适配异步场景的方案,相比手动线程池更贴合Django的数据库连接机制,优先推荐使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:50:27