Ein OneToOneField
ist sehr ähnlich zu einem ForeignKey
mit unique=True
. Sofern Sie nicht die Vererbung mehrerer Tabellen durchführen, müssen Sie in diesem Fall OneToOneField
verwenden. Der einzige wirkliche Unterschied ist die API für den Zugriff auf verwandte Objekte.
Im Django docs heißt es:
Konzeptionell dies ein ForeignKey
mit unique=True
ähnlich ist, aber die „Rückwärts“ Seite der Beziehung wird direkt ein einzelnes Objekt zurück.
Lassen Sie uns zeigen, was das an einem Beispiel bedeutet. Betrachten Sie zwei Modelle, Person
und Address
. Wir nehmen an, dass jede Person eine eindeutige Adresse hat.
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)
Wenn Sie mit einer Person beginnen, können Sie die Adresse leicht zugänglich machen:
address = person.address
Allerdings, wenn Sie mit einer Adresse beginnen, müssen Sie über die person_set
Manager gehen, um die Person zu bekommen.
person = address.person_set.get() # may raise Person.DoesNotExist
Lassen Sie uns nun die ForeignKey
mit einem OneToOneField
ersetzen.
class Person(models.Model):
name = models.CharField(max_length=50)
address = models.OneToOneField('Address')
class Address(models.Model):
street = models.CharField(max_length=50)
Wenn Sie mit einer Person beginnen, können Sie die Adresse auf die gleiche Art und Weise zuzugreifen:
address = person.address
Und jetzt können wir die Person, von der Adresse leichter zugreifen.
person = address.person # may raise Person.DoesNotExist
@alan War nicht genug Klärung in anderen Antworten wie dieser verfügbar Alasdir's Answer klärt das Konzept sehr gut – Hafiz