Ответ 1
OneToOneField
очень похож на ForeignKey
с unique=True
. Если вы не используете множественное наследование таблиц, в этом случае вам нужно использовать OneToOneField
, единственное реальное различие - это api для доступа к связанным объектам.
В документах Django говорится:
Концептуально это похоже на
ForeignKey
сunique=True
, но "обратная" сторона отношения будет напрямую возвращать один объект.
Покажем, что это значит с примером. Рассмотрим две модели: " Person
и 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
на 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