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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:24:33