Django与Postgres多对多关联表插入数据不生效问题求助
问题核心原因
你的操作存在3处关键错误,导致关联关系不生效:
- Django在执行模型迁移时已经自动生成了多对多关联表,你不需要手动创建关联表,你手动创建的
movie_actors表不符合Django ORM的默认命名规则,Django读取关联关系时不会访问该表 - Django默认的多对多关联表命名规则为
{小写App名称}_{小写模型名}_{小写多对多字段名},例如你的Movie模型放在名为film的App下,关联表默认名称为film_movie_actor,而非你自定义的movie_actors - 你的原生SQL存在字段名、表名错误:
- Movie、Actor模型的主键默认名为
id,而非你写的movie_id、actor_id - 查询电影数据的表名你写为
movie,和Django生成的表名(默认为{App名}_movie)不符 - 插入演员时名称为
actorname,查询时写的actor name多了空格,会导致查询不到对应ID
- Movie、Actor模型的主键默认名为
解决方法
方案1:继续使用原生SQL插入(需先对齐Django规则)
- 首先获取Django自动生成的关联表信息:进入Django项目根目录,执行命令
python manage.py sqlmigrate 你的App名称 0001(0001为你首次创建Movie、Actor模型的迁移文件序号),找到创建多对多关联表的SQL语句,确认正确的关联表名、两个外键字段名 - 修正插入关联关系的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会自动处理关联关系,适配所有规则:
- 在你的爬取脚本开头添加以下代码,加载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
- 直接用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
相关产品推荐
相关产品推荐

