A OneToOneField
è molto simile a ForeignKey
con unique=True
. A meno che non si stia eseguendo l'ereditarietà di più tabelle, nel qual caso è necessario utilizzare OneToOneField
, l'unica vera differenza è l'API per l'accesso agli oggetti correlati.
Nel Django docs si dice:
Concettualmente, questo è simile a un ForeignKey
con unique=True
, ma il "rovescio" lato della relazione restituirà direttamente un singolo oggetto.
Mostriamo cosa significa questo con un esempio. Considera due modelli, Person
e Address
. Assumeremo che ogni persona abbia un indirizzo univoco.
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)
Se si inizia con una persona, è possibile accedere all'indirizzo facilmente:
address = person.address
Tuttavia, se si inizia con un indirizzo, devi andare via person_set
manager per ottenere la persona.
person = address.person_set.get() # may raise Person.DoesNotExist
Ora cerchiamo di sostituire il 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)
Se si inizia con una persona, è possibile accedere all'indirizzo nello stesso modo:
address = person.address
E ora, siamo in grado di accedere la persona con l'indirizzo più facilmente.
person = address.person # may raise Person.DoesNotExist
@alan Non sono stati sufficienti chiarimenti disponibili in altre risposte come questa Risposta di Alasdir chiarire molto bene il concetto – Hafiz