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

Django与Postgres多对多关联表插入数据不生效问题求助

问题核心原因

你的操作存在3处关键错误,导致关联关系不生效:

  1. Django在执行模型迁移时已经自动生成了多对多关联表,你不需要手动创建关联表,你手动创建的movie_actors表不符合Django ORM的默认命名规则,Django读取关联关系时不会访问该表
  2. Django默认的多对多关联表命名规则为 {小写App名称}_{小写模型名}_{小写多对多字段名},例如你的Movie模型放在名为film的App下,关联表默认名称为film_movie_actor,而非你自定义的movie_actors
  3. 你的原生SQL存在字段名、表名错误:
    • Movie、Actor模型的主键默认名为id,而非你写的movie_id、actor_id
    • 查询电影数据的表名你写为movie,和Django生成的表名(默认为{App名}_movie)不符
    • 插入演员时名称为actorname,查询时写的actor name多了空格,会导致查询不到对应ID
解决方法

方案1:继续使用原生SQL插入(需先对齐Django规则)

  1. 首先获取Django自动生成的关联表信息:进入Django项目根目录,执行命令python manage.py sqlmigrate 你的App名称 0001(0001为你首次创建Movie、Actor模型的迁移文件序号),找到创建多对多关联表的SQL语句,确认正确的关联表名、两个外键字段名
  2. 修正插入关联关系的SQL,示例如下(需替换为你实际的表名、字段名):
INSERT INTO 正确的关联表名 (movie_id, actor_id)
VALUES (
  (SELECT id FROM 正确的Movie表名 WHERE name = 'movie name'),
  (SELECT id FROM 正确的Actor表名 WHERE name = 'actorname')
);

方案2:脚本引入Django环境,用ORM操作(推荐,无兼容问题)

不需要关心关联表的底层逻辑,Django会自动处理关联关系,适配所有规则:

  1. 在你的爬取脚本开头添加以下代码,加载Django运行环境:
import sys
import os
# 替换为你的Django项目根目录绝对路径
sys.path.append("/path/to/your/django/project/root")
# 替换为你的Django项目的settings模块路径
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "你的项目名.settings")
import django
django.setup()

# 导入你的模型
from 你的App名.models import Movie, Actor
  1. 直接用ORM插入数据、绑定关联即可:
# 插入或查询已存在的电影
movie, _ = Movie.objects.get_or_create(
    name="movie name",
    defaults={"summary": "sth"}
)
# 插入或查询已存在的演员
actor, _ = Actor.objects.get_or_create(
    name="actorname",
    defaults={"bio": "sth"}
)
# 绑定多对多关联
movie.actor.add(actor)
movie.save()

可选:自定义关联表名适配你手动创建的表

如果你希望继续使用你手动创建的movie_actors表,可以修改Movie模型的多对多字段配置,指定关联表名:

actor = models.ManyToManyField(Actor, blank=True, db_table="movie_actors")

修改后执行python manage.py makemigrations和python manage.py migrate,Django就会识别你手动创建的movie_actors表作为关联表,前提是你表内的外键字段名为movie_id和actor_id。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 17:36:08