A OneToOneField
es muy similar a ForeignKey
con unique=True
. A menos que esté haciendo herencia de tablas múltiples, en cuyo caso debe usar OneToOneField
, la única diferencia real es la API para acceder a objetos relacionados.
En el Django docs Dice:
Conceptualmente, esto es similar a un ForeignKey
con unique=True
, pero la "marcha atrás" lado de la relación devolverá directamente un solo objeto.
Vamos a mostrar lo que eso significa con un ejemplo. Considere dos modelos, Person
y Address
. Asumiremos que cada persona tiene una dirección única.
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)
Si usted comienza con una persona, se puede acceder a la dirección fácil:
address = person.address
Sin embargo, si usted comienza con una dirección, usted tiene que ir a través del gestor person_set
llevar a la persona.
person = address.person_set.get() # may raise Person.DoesNotExist
Ahora vamos a sustituir el ForeignKey
con un 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)
Si usted comienza con una persona, se puede acceder a la dirección de la misma manera:
address = person.address
Y ahora, puede acceder a la persona de la dirección con mayor facilidad.
person = address.person # may raise Person.DoesNotExist
@alan No hubo suficiente aclaración disponible en otras respuestas como esta La respuesta de Alasdir aclara muy bien el concepto – Hafiz