A OneToOneField
非常类似于ForeignKey
with unique=True
。除非你正在进行多表继承,在这种情况下你必须使用OneToOneField
,唯一真正的区别是用于访问相关对象的 api。
In the Django 文档 https://docs.djangoproject.com/en/dev/ref/models/fields/#onetoonefield它说:
从概念上讲,这类似于ForeignKey
with unique=True
,但关系的“反向”端将直接返回单个对象。
让我们用一个例子来说明这意味着什么。考虑两个模型,Person
and Address
。我们假设每个人都有一个唯一的地址。
class Person(models.Model):
name = models.CharField(max_length=50)
address = models.ForeignKey('Address', unique=True)
class Address(models.Model):
street = models.CharField(max_length=50)
如果你从一个人开始,你可以轻松访问该地址:
address = person.address
但是,如果您从地址开始,则必须通过person_set
经理来找人。
person = address.person_set.get() # may raise Person.DoesNotExist
现在让我们替换ForeignKey
with a OneToOneField
.
class Person(models.Model):
name = models.CharField(max_length=50)
address = models.OneToOneField('Address')
class Address(models.Model):
street = models.CharField(max_length=50)
如果你从一个人开始,你可以用同样的方式访问该地址:
address = person.address
现在,我们可以更轻松地通过该地址访问此人。
person = address.person # may raise Person.DoesNotExist