Django: Wenn Benutzer erweitert wird, besser OneToOneField (User) oder ForeignKey (User, unique = True)?
Ich bin suchen widersprüchliche Informationen auf, ob OneToOneField(Benutzer) oder ForeignKey(User, unique=True) bei der Erstellung eines Benutzerprofil-Modell durch die Verlängerung der Django-User-Modell.
Ist es besser, dies zu nutzen?:
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
oder?:
class UserProfile(models.Model):
user = models.OneToOneField(User)
Den Django Doc gibt OneToOneField, während die Django Buch Beispiel ForeignKey verwendet.
James Bennett hat auch zwei Blog-posts, die Bereitstellung von widersprüchlichen Beispiele:
In der ehemaligen post, Bennett bietet einige Gründe, warum er wechselte mit ForeignKey statt OneToOneField, aber ich weiß nicht Recht bekommen, vor allem, wenn ich sehe andere Beiträge, die empfehlen das Gegenteil.
Ich bin neugierig, zu wissen, Ihre Vorlieben und warum. Oder, ist es auch egal?
InformationsquelleAutor der Frage Tony Guinta | 2010-07-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einzige wirkliche Grund, warum in dem Artikel ist, dass es kann so eingestellt werden, dass der admin-Seite für
User
zeigen die beiden Felder inUser
undUserProfile
. Diese können repliziert werden, mit einemOneToOneField
mit ein wenig Ellenbogen Fett, es sei denn, du bist süchtig zu zeigen, dass Sie es in der admin-Seite mit der Arbeit nicht auf Kosten von ein bisschen Klarheit ("Wir können mehrere profile pro user?! Oh Nein, warte, ist einzigartig.") Ich würde verwendenOneToOneField
.InformationsquelleAutor der Antwort Ignacio Vazquez-Abrams
Neben der admin-Seite inlines, anderen Grund für die
ForeignKey
Lösung ist, dass es ermöglicht, die korrekte, DB-manager, wenn sich die Objekte zugegriffen werden, mit einem umgekehrten Verhältnis. Betrachten Beispiel aus dieser Unterklassen manager snippet. Lassen Sie uns sagen, dass diePost
class definition aus dem Beispiel sieht wie folgt aus:Durch den Aufruf
somemodel_instance.post_set.all()[0]
erhalten Sie die gewünschte Unterklassen Objekte von derPost
Klasse, wie durch die Festlegung der ersten (Standard -) manager alsChildManager
. Auf der anderen Seite, mitOneToOneField
durch Aufrufsomemodel_instance.post
erhalten Sie diePost
Instanz der Klasse. Sie können immer anrufensomemodel_instance.post.subclass_object
und das gleiche Ergebnis erhalten, aber die Standard-manager tun können, jede andere Art von tricks und dieFK
Lösungen versteckt Sie gut.Wenn Sie eigenen und können ändern, die benutzerdefinierte manager-code, den Sie verwenden können, die
use_for_related_fields
Attribut statt mit FK anstelle von legitimen 1zu1 Feld, aber selbst das kann scheitern, weil der andere nicht-mir bekannten Belästigungen der automatische Manager. Soweit ich mich erinnere wird es nicht in dem oben genannten Beispiel.InformationsquelleAutor der Antwort trybik
Anderen Grund in der Regel nicht verwenden Sie den
OneToOneField
Bezug auf reverse-Beziehungen: bei der Verwendung von reverse-Beziehungen definiert überOneToOneField
erhalten Sie eine model-Instanz, im Gegensatz zuManager
fürForeignKey
umgekehrter Beziehung und als Folge gibt es immer ein DB Treffer. Dies ist teuer, wenn Sie einige generische Zeug auf der Rückseite Beziehungen (über_meta.get_all_related_objects()
) und wissen nicht, und Sorge, wenn Sie Sie benutzen oder nicht.InformationsquelleAutor der Antwort trybik