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 子集