2

有人可以解释将 Django 模型中的关系指定为一对一的重要性,而不仅仅是外键吗?

具体来说,我想知道将关系指定为 1-1(如果有)有什么好处。

非常感谢。

4

4 回答 4

10

OneToOneField'ForeignKey' 之后在 Django 中的演变。从概念上讲,ForeignKey带有unique=True约束的 a 类似于OneToOneField

因此,如果您想确保每张图片都有一个用户,反之亦然,请使用OneToOneField.

如果您希望一个用户拥有任意数量的图片,请使用ForeignKey.

选择事物的方式也不同。在做的情况下OneToOneField,可以做user.picture,直接获取图片。如果ForeignKeyuser.picture_set[0]需要获取第一张图片或访问与该用户关联的所有图片。

MultiTableInheritance在内部隐式使用 OneToOneField,您可以看到这个概念的来源。

于 2012-10-29T06:52:33.783 回答
2

他们是不一样的; 想一想:

User如果 a和 a之间存在一对一的关系Picture,则表示用户只能拥有一张图片(并且一张图片只能拥有一个用户)。如果你有一个Picture带有外键的User,那么你是说一张图片必须只有一个用户,但一个用户可能有 0、1 或多张图片。

于 2012-10-29T03:04:49.513 回答
2

1-1 的附加约束提供了更紧密和更丰富的概念模型,但也可以提供可以进行更直观检索的洞察力。由于多对一表示父/集合关系,因此与检索特定实体的任何给定集合相关的成本不明确。由于 1-1 提供了一个平面映射,因此检索的成本也是一个平面。这将导致诸如在相关时更喜欢急切获取之类的事情,因为连接将能够轻松优化,并且生成的数据集将是已知大小。

于 2012-10-29T03:41:41.883 回答
0

Django 的外键是多对一的关系。现在,它们之间的区别与一对一和多对一关系之间的区别相同。例如,如果您有 User 和 Profile 实体。您想添加一个约束,即每个用户只能拥有一个配置文件。然后,使用 django 的一对一字段会对数据库级别产生限制,因此您将无法将用户与多个配置文件相关联,反之亦然。使用外键不会提供此约束。

于 2012-10-29T03:03:02.650 回答