django的OneToOneField和django的OneToOneRel之间的区别

acq*_*ank 7 django

django的OneToOneField和django的OneToOneRel之间的主要区别是什么.

当我搜索时,我遇到了:

django OneToOneField和ForeignKey有什么区别?

Dan*_*man 8

OneToOneRel是一个内部类,它实现了一对一关系的后向引用.它没有记录在任何地方,也不是任何公共API的一部分,并且不适用于您的应用程序.


all*_*aps 6

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

我决定在 Django 源代码中查找 OneToOneField。这是OneToOneField文档字符串

OneToOneField 本质上与 ForeignKey 相同,除了它总是带有“唯一”约束并且反向关系总是返回指向的对象(因为永远只有一个),而不是返回一个列表。

但我们已经知道了。很酷的是,你会看到几行

rel_class = OneToOneRel
Run Code Online (Sandbox Code Playgroud)

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

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

class OneToOneRel(ManyToOneRel):
    ...
Run Code Online (Sandbox Code Playgroud)

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

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

重要的部分:您不能像比较 OneToOneField 和 ForeignKey 那样比较 OneToOneField 和 OneToOneRel,因为 OneToOneRel 不是关系字段。