ForeignKey vs OneToOne 字段 django [重复]

Posted

技术标签:

【中文标题】ForeignKey vs OneToOne 字段 django [重复]【英文标题】:ForeignKey vs OneToOne field django [duplicate] 【发布时间】:2012-05-25 04:21:42 【问题描述】:

我需要用一些额外的字段来扩展 django 用户。我在那里找到了 2 种不同的方式

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    #other fields

class UserProfile(models.Model):
    user = models.ForeignKey(User)
    #other fields

他们不一样吗?同步它们后,我发现 mysql 数据库没有任何区别

【问题讨论】:

【参考方案1】:

不,你为什么会这样想? ForeignKey 是一对多的关系——即一个用户可以有许多个人资料。顾名思义,OneToOne 是一对一的关系 - 用户只能拥有一个个人资料,这听起来更有可能。

【讨论】:

同步之后,我发现mysql数据库没有什么区别,我问的是怎么区分的 在数据库中的唯一区别是对列的唯一约束是一对一的。事实上,OneToOneField 只是ForeignKey(unique=True) 您不会在数据库中看到任何差异,因为 syncdb 在定义表后不会更改它们,您需要删除并重新创建它们。但是,您可以使用 sqlall 来显示不同的输出 - 正如 Chris 所说,OneToOne 具有唯一的约束。【参考方案2】:

正如@Daniel Roseman 所说,这是 2 种不同类型的 rdbms 关系。

您会发现它在您将拥有的情况下有所区分(可能是错误的) 给定用户的多个配置文件。在那种情况下,myuser.get_profile() 会提出 MultipleObjectsReturned 异常,因为它本质上是在后台执行 get() 查询。

【讨论】:

+1 好点。从技术上讲,您可以使用 ForeignKey,但如果您尝试创建多个配置文件,则将其设置为适当的一对一可以通过引发异常来保护您自己。 @ChrisPratt 是的。基本上,如果您使用 ForeignKey 执行此操作,则与 django 规范有很大差异(因为您使 get_profile 变得无用),因此最好将扩展模型命名为 UserProfile 以外的名称。

以上是关于ForeignKey vs OneToOne 字段 django [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Django中的OnetoOne(primary_key = Tue)到ForeignKey

Django - 将 ForeignKey 关系更改为 OneToOne

Drf 序列化 ModelSerializer跨表取数据

Django笔记七之ManyToMany和OneToOne介绍

Hibernate:复合主键 - 外键:如何在两个表之间映射各个字段

Django OneToOne 字段到自我