【问题标题】:ForeignKey vs OneToOne field django [duplicate]ForeignKey vs OneToOne 字段 django [重复]
【发布时间】: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 数据库没有任何区别

【问题讨论】:

    标签: python django django-models


    【解决方案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 以外的名称。
    猜你喜欢
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 2011-11-12
    • 2018-03-01
    • 2020-08-02
    • 2016-11-10
    • 1970-01-01
    相关资源
    最近更新 更多