2012-05-17 13 views
6

Ich muss django Benutzer mit einigen zusätzlichen Feldern erweitern. Ich fand zwei verschiedene Möglichkeiten gibtForeignKey vs OneToOne Feld django

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    #other fields 

ODER

class UserProfile(models.Model): 
    user = models.ForeignKey(User) 
    #other fields 

Sind sie nicht gleich? Nach der Synchronisierung, sah ich keinen Unterschied in MySQL-Datenbank

Antwort

5

Nein, warum würden Sie das denken? Ein ForeignKey ist eine Eins-zu-Viele-Beziehung - dh ein Benutzer könnte viele Profile haben. Ein OneToOne ist, wie der Name schon sagt, eine Eins-zu-eins-Beziehung - ein Benutzer kann nur ein Profil haben, das wahrscheinlicher klingt.

+0

Nach der Synchronisierung, sah ich keinen Unterschied in der MySQL-Datenbank, ich fragte, wie es unterscheidet – sumit

+8

Der einzige Unterschied * in der Datenbank * ist eine eindeutige Einschränkung für die Spalte mit einem eins zu eins. Tatsächlich ist 'OneToOneField' lediglich' ForeignKey (unique = True) ''. –

+1

Sie würden keinen Unterschied in Ihrer Datenbank sehen, da syncdb die Tabellen nicht ändert, sobald sie definiert sind, Sie müssten sie löschen und neu erstellen. Sie können jedoch 'sqlall' verwenden, um die verschiedenen Ausgaben zu zeigen - wie Chris sagt, ein OneToOne hat eine einzigartige Einschränkung. –

4

Wie @Daniel Roseman sagte, dies sind 2 verschiedene Arten von Rdbms-Beziehungen.

Sie werden feststellen, dass es in der Situation unterscheidet, in der Sie (aus Versehen wahrscheinlich) mehrere Profile für einen bestimmten Benutzer haben. In dieser Situation wird myuser.get_profile() eine MultipleObjectsReturned Ausnahme auslösen, da es im Wesentlichen eine get() Abfrage unter der Haube macht.

+0

+1 Guter Punkt. Sie könnten technisch einen ForeignKey verwenden, aber wenn Sie ihn als eine Eins-zu-eins-Einheit einrichten, schützt er Sie vor sich selbst, indem er eine Ausnahme auslöst, wenn Sie versuchen, mehr als ein Profil zu erstellen. –

+0

@ChrisPratt Ja. Grundsätzlich, wenn Sie es mit einem ForeignKey tun, weichen Sie so sehr von der Django-Spezifikation ab (da Sie get_profile nutzlos machen), dass Sie besser dran sind, wenn Sie Ihr Erweiterungsmodell etwas anderes als 'UserProfile' nennen. – rantanplan