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

Django中使用ManyToManyField添加关联数据时触发语法错误的问题

嘿,我之前碰到过一模一样的问题,咱们来拆解下原因和解决办法:

问题本质

你看到的syntax error at or near "ON"报错,是因为Django在执行user_pages.add(p1)时,生成了带有ON CONFLICT的SQL语句——这个语法是PostgreSQL 9.5及以上版本才支持的「插入或更新(Upsert)」特性。如果你的PostgreSQL版本低于9.5,或者数据库配置出了问题,老版本数据库根本认不出这个关键字,自然就报错了。

具体解决步骤

1. 先查PostgreSQL版本

先打开终端,运行下面的命令确认你的数据库版本:

psql --version

如果输出的版本号低于9.5,那必须升级到9.5或更高版本(建议直接升到12+的稳定版),这是最彻底的解决办法。

2. 检查Django的数据库配置

打开项目根目录的settings.py,找到DATABASES配置块,确保数据库引擎是PostgreSQL的正确配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',  # 这里不能错!
        'NAME': '你的数据库名',
        'USER': '你的数据库用户名',
        'PASSWORD': '你的数据库密码',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

如果之前误写成了sqlite3或者其他引擎,改成上面的格式后,重启服务再测试。

3. 临时规避方案(仅应急用)

如果暂时没法升级数据库,可以先绕开Django的Upsert逻辑——手动检查关联是否存在,再添加:

# 替换原来的user_profile.user_pages.add(p1)
if not user_profile.user_pages.filter(id=p1.id).exists():
    user_profile.user_pages.add(p1)

不过这个方法只是临时救急,长期来看还是升级数据库更稳妥。

额外排查点

如果以上步骤都做完还是报错,试试重新生成并执行数据库迁移:

python manage.py makemigrations
python manage.py migrate

有时候旧的迁移文件可能导致表结构异常,重新迁移能修复这类问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:18:24