Django中的OneToOneField和ForeignKey有什么区别?
当前回答
OneToOneField(一对一)在面向对象中实现了组合的概念,而ForeignKey(一对多)则与聚合有关。
其他回答
当您访问OneToOneField时,您将获得您查询的字段的值。在这个例子中,图书模型的title字段是一个OneToOneField:
>>> from mysite.books.models import Book
>>> b = Book.objects.get(id=50)
>>> b.title
u'The Django Book'
当你访问一个ForeignKey时,你得到了相关的模型对象,然后你可以对它进行进一步的查询。在这个例子中,同一个图书模型的'publisher'字段是一个ForeignKey(与publisher类模型定义相关):
>>> b = Book.objects.get(id=50)
>>> b.publisher
<Publisher: Apress Publishing>
>>> b.publisher.website
u'http://www.apress.com/'
对于ForeignKey字段,查询也以另一种方式工作,但由于关系的非对称性质,它们略有不同。
>>> p = Publisher.objects.get(name='Apress Publishing')
>>> p.book_set.all()
[<Book: The Django Book>, <Book: Dive Into Python>, ...]
在幕后,book_set只是一个QuerySet,可以像其他QuerySet一样被过滤和切片。属性名称book_set是通过将小写模型名称附加到_set而生成的。
OneToOneField(一对一)在面向对象中实现了组合的概念,而ForeignKey(一对多)则与聚合有关。
绘制项目之间关系的最简单方法是用简单的语言理解它们。例子
一个用户可以有很多辆车,但一辆车只能有一个车主。建立此关系后,应将外键用于关系较多的项上。在这种情况下,是汽车。这意味着您将在cars中包含user作为外键
一对一的关系很简单。说一个男人和一颗心。一个人只有一颗心,而一颗心只能属于一个人
OneToOneField(例如:一辆车有一个车主) ForeignKey(OneToMany)(例如:一个餐厅有很多项目)
ForeignKey是一个多对一的关系。因此,Car对象可能有许多Wheel实例。因此,每个Wheel都有一个它所属的Car的ForeignKey。OneToOneField就像Engine的一个实例,其中Car对象最多只有一个。
推荐文章
- django MultiValueDictKeyError错误,我如何处理它
- 我如何在Django中创建一个鼻涕虫?
- 没有名为'django.core.urlresolvers'的模块
- Django - makemigrations -未检测到任何更改
- ">", "<", ">=" 和“< =”不工作”在Django过滤()”
- Django项目工作目录结构的最佳实践
- 如何在Django中表达一对多关系?
- 用Django创建电子邮件模板
- Django的嵌套元类是如何工作的?
- 用Django实现OpenID的最佳解决方案是什么?
- 在使用信号时,你不能在'原子'块的末尾执行查询,但只能在单元测试期间执行
- Django查询- id vs pk
- render(), render_to_response()和direct_to_template()之间有什么区别?
- 如何使用MySQLdb与Python和Django在OSX 10.6?
- 如何在Django中一次添加多个对象到ManyToMany关系?