django 的 OneToOneField 和 django 的 OneToOneRel 的区别

Posted

技术标签:

【中文标题】django 的 OneToOneField 和 django 的 OneToOneRel 的区别【英文标题】:Difference between django's OneToOneField and django's OneToOneRel 【发布时间】:2015-03-26 15:24:24 【问题描述】:

django 的 OneToOneField 和 django 的 OneToOneRel 的主要区别是什么。

当我搜索时,我发现了:

What's the difference between django OneToOneField and ForeignKey?

【问题讨论】:

【参考方案1】:

OneToOneRel 是一个内部类,它实现了一对一关系的反向引用。它没有记录在任何地方,不是任何公共 API 的一部分,也不能在您的应用中使用。

【讨论】:

【参考方案2】:

首先我想,没有“OneToOneRel”。但是还有。它不在文档中。但它存在于 Django 源代码中。所以有第一个区别。 ;)

我决定在 Django 源代码中查找 OneToOneField。这是docstring for the OneToOneField:

OneToOneField 本质上与 ForeignKey 相同,具有 始终带有“唯一”约束的异常以及 反向关系总是返回指向的对象(因为那里 只会是一个),而不是返回一个列表。

但我们都已经知道了。很酷的是,few lines down 你看:

rel_class = OneToOneRel

所以第二个区别是OneToOneRel用在OneToOneField中。

比我在这个 Python 文件中搜索 OneToOneRel 发现:

class OneToOneRel(ManyToOneRel):
    ...

所以第三个区别是 OneToOneRel 是 ManyToOneRel 的子类,而 OneToOneField 是 ForeignKey 的子类。

对我来说,知道这一点就足够了:OneToOneRel 用于 OneToOneField。 OneToOneRel 是 ManyToOneRel 用于 ForeignKey 和 ManyToManyRel 用于 ManyToManyField。那些 rel 类似乎可以处理约束。

重要的部分:您无法将 OneToOneField 与 OneToOneRel 进行比较,就像将 OneToOneField 与 ForeignKey 进行比较一样,因为 OneToOneRel 不是关系字段。

【讨论】:

以上是关于django 的 OneToOneField 和 django 的 OneToOneRel 的区别的主要内容,如果未能解决你的问题,请参考以下文章

django OneToOneField 和 ForeignKey 有啥区别?

Django模型中的OneToOneField和ForeignKey有什么区别?

Django OneToOneField、ManyToManyField、外键

ManyToManyField 的 Django OneToOneField 子集

为啥 django-rest-framework 不显示 OneToOneField 数据 - django

Django模型中的OneToOneField和ForeignKey有啥区别