Python ForeignKey vs OneToOne field django

Python ForeignKey vs OneToOne field django,python,django,django-models,Python,Django,Django Models,我需要用一些额外的字段扩展django用户。我在那里找到了两种不同的方法 class UserProfile(models.Model): user = models.OneToOneField(User) #other fields 或 他们不一样吗?在同步它们之后,我在mysql数据库中看不到任何差异不,你为什么会这样想?ForeignKey是一对多关系,即用户可以有多个配置文件。顾名思义,OneToOne是一种一对一的关系——一个用户只能有一个配置文件,这听起来更有可能。

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

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


他们不一样吗?在同步它们之后,我在mysql数据库中看不到任何差异

不,你为什么会这样想?ForeignKey是一对多关系,即用户可以有多个配置文件。顾名思义,OneToOne是一种一对一的关系——一个用户只能有一个配置文件,这听起来更有可能。

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

你会发现它在你可能(可能是错误地)遇到的情况下会有所区别 给定用户的多个配置文件。在这种情况下,
myuser.get\u profile()
将引发
一个
MultipleObjectsReturned
异常,因为它本质上是在引擎盖下进行查询。

在同步它们之后,我在mysql数据库中没有看到任何区别,我在问它是如何区别的。数据库中唯一的区别是对列的一对一的唯一约束。事实上,
OneToOneField
仅仅是
ForeignKey(unique=True)
。您在数据库中看不到任何差异,因为syncdb在定义表之后不会更改表,您需要删除并重新创建它们。但是,您可以使用
sqlall
来显示不同的输出-正如Chris所说,OneToOne具有唯一的约束。+1很好。从技术上讲,您可以使用ForeignKey,但如果您试图创建多个配置文件,则将其设置为正确的一对一可以引发异常,从而保护您免受攻击。@ChrisPratt Yes。基本上,如果使用ForeignKey,那么与django规范的差异很大(因为您使get_profile变得无用),因此最好将扩展模型命名为
UserProfile
以外的名称。
class UserProfile(models.Model):
    user = models.ForeignKey(User)
    #other fields