Django多对一关系中ForeignKey外键应定义在哪个模型中?
Django多对一关系ForeignKey定义位置说明
核心规则
ForeignKey字段必须定义在多对一关系中代表「多」的一侧模型上,完全对齐关系型数据库的底层外键设计:多条从属记录通过存储所关联主记录的主键值完成绑定,「一」侧模型不需要额外定义关联字段。
帖子-评论场景实现
你提到的Post(帖子)和Comment(评论)是典型多对一关系:
- 「一」侧:Post,单篇帖子可对应多条评论
- 「多」侧:Comment,单条评论仅能归属一篇帖子
关联Post的外键确实应该定义在Comment模型中,你的判断正确。
修正后的Comment模型代码
class Comment(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('user'), on_delete=models.CASCADE) # 新增Post关联外键,定义在「多」侧Comment模型上 post = models.ForeignKey("post", on_delete=models.CASCADE, related_name="comments") text = models.TextField()
关联查询方式
- 查某篇帖子下所有评论:外键设置
related_name="comments"后,直接调用Post实例的post.comments.all()即可获取全部关联评论 - 查某条评论所属帖子:直接调用Comment实例的
comment.post即可拿到对应帖子对象
注意事项
不要尝试在Post(「一」侧模型)中存放评论关联字段:单条Post记录的单个字段只能存单个值,无法承载一篇帖子对应的多条评论关联关系,这也是外键必须放在「多」侧的核心原因。
你现有Post模型里的user外键本身就符合该规则:一个用户可发布多篇帖子,Post是关系中「多」的一侧,外键放在Post模型中是正确写法。
内容的提问来源于stack exchange,提问作者Reza Shakeri
相关产品推荐
相关产品推荐

