2012-03-30 10 views

Antwort

38

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 
+1

Ich denke, du meintest "Adresse = models.ForeignKey (Adresse, unique = True)" in der Personenklasse. – alan

+0

@alan - guter Fang, jetzt behoben. – Alasdair

1

Wenn Sie Zugriff auf ein OneToOneField Sie den Wert des Feldes Sie abgefragt bekommen. In diesem Beispiel wird ein ‚Titel‘ Feldbuch-Modell ist ein OneToOneField:

>>> from mysite.books.models import Book 
>>> b = Book.objects.get(id=50) 
>>> b.title 
u'The Django Book' 

Wenn Sie ein ForeignKey Zugang erhalten Sie das zugehörige Modellobjekt, die Sie dann weitere Fragen gegen die Vorform können. In diesem Beispiel ist das gleiche Buch Modell der "Verlag Feld ein ForeignKey (Korrelation zu der Modelldefinition Publisher Klasse):

>>> b = Book.objects.get(id=50) 
>>> b.publisher 
<Publisher: Apress Publishing> 
>>> b.publisher.website 
u'http://www.apress.com/' 

Mit ForeignKey Feldern Abfragen auch in die andere Richtung arbeiten, aber sie sind etwas anders aufgrund des nicht symmetrische Art der Beziehung.

>>> p = Publisher.objects.get(name='Apress Publishing') 
>>> p.book_set.all() 
[<Book: The Django Book>, <Book: Dive Into Python>, ...] 

Hinter den Kulissen ist book_set nur QuerySet und kann wie jede andere QuerySet gefiltert und in Scheiben geschnitten werden. Der Attributname book_set wird generiert, indem der Name des Kleinbuchstabenmodells an _set angehängt wird. Ich hoffe, dies hilft, die Unterschiede zwischen den Beziehungen zu veranschaulichen.

Verwandte Themen