如何在Django模型中通过主键建立ManyToMany关系?
解决方案
你需要在其中一个模型里添加ManyToManyField,并通过db_table参数指定关联表名称为host_team。Django会自动为这个关联表生成自增主键id,同时自动创建host_id和team_id两个外键字段,完全匹配你需要的表结构。
修改后的模型代码
from django.db import models from django.contrib.auth.models import User class Host(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) bio_information = models.ForeignKey(Bio, on_delete=models.CASCADE) # 新增多对多关联,指定关联表名称 teams = models.ManyToManyField('Team', db_table='host_team') class Team(models.Model): name = models.CharField(max_length=50) creator = models.ForeignKey(Host, on_delete=models.CASCADE)
如果更习惯从Team侧关联,也可以这么写,效果完全一致:
class Team(models.Model): name = models.CharField(max_length=50) creator = models.ForeignKey(Host, on_delete=models.CASCADE) # 新增多对多关联,指定关联表名称 hosts = models.ManyToManyField(Host, db_table='host_team')
关键细节
db_table='host_team':强制Django跳过默认的应用名_模型名_关联名命名规则,直接使用你指定的表名。- 关联表的自增主键
id是Django默认生成的,不需要手动定义。 host_id和team_id会自动作为外键,分别关联Host和Team的主键。
同步数据库
修改完模型后,执行以下命令让数据库变更生效:
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者CodeMonkey
相关产品推荐
相关产品推荐

