Wann sollte man in Django „OneToOneField()' vs. „ForeignKey(unique=True)' wählen?

Barbara Streisand
Freigeben: 2024-11-07 03:23:02
Original
119 Leute haben es durchsucht

When to Choose `OneToOneField()` vs `ForeignKey(unique=True)` in Django?

Vergleich von Djangos OneToOneField() und ForeignKey()

Django bietet zwei Hauptmechanismen zum Herstellen von Beziehungen zwischen Modellen: OneToOneField() und ForeignKey( ). Während beide Eins-zu-eins-Zuordnungen zulassen, unterscheiden sie sich in ihrem Verhalten und ihren Konsequenzen.

OneToOneField() und ForeignKey(unique=True)

Im Wesentlichen gilt: OneToOneField(SomeModel) ähnelt funktional einem ForeignKey(SomeModel, unique=True). In beiden Fällen erzwingen Sie eine eindeutige Beziehung zwischen Objekten. Es gibt jedoch einen subtilen Unterschied:

OneToOneField stellt eine bidirektionale Beziehung bereit, bei der das Abrufen eines Objekts auf der „Rückseite“ direkt das entsprechende einzelne Objekt zurückgibt.

car = Car.objects.get(name='Audi')
engine = car.engine # Returns the corresponding Engine object directly
Nach dem Login kopieren

ForeignKey mit unique=True hingegen behält eine unidirektionale Beziehung bei. Das Abrufen eines Objekts auf der „Rückseite“ gibt ein QuerySet zurück.

car2 = Car2.objects.get(name='Mazda')
engines = car2.engine2_set.all() # Returns a QuerySet containing the corresponding Engine2 object
Nach dem Login kopieren

Beispielillustration

Betrachten Sie zwei Modelle: Auto und Motor, wobei Auto OneToOneField() verwendet und Car2 verwendet ForeignKey(unique=True). Die Ausführung des folgenden Codes zeigt die Unterschiede:

# OneToOneField
car = Car.objects.get(name='Audi')
engine = Engine.objects.get(name='Diesel')
print(engine.car)  # Prints "Audi"

# ForeignKey with unique=True
car2 = Car2.objects.get(name='Mazda')
engine2 = Engine2.objects.get(name='Wankel')
print(engine2.car2_set.all())  # Prints "[<Car2: Mazda>]"
Nach dem Login kopieren

Modellcode als Referenz

class Engine(models.Model):
    name = models.CharField(max_length=25)

class Car(models.Model):
    name = models.CharField(max_length=25)
    engine = models.OneToOneField(Engine)

class Engine2(models.Model):
    name = models.CharField(max_length=25)

class Car2(models.Model):
    name = models.CharField(max_length=25)
    engine = models.ForeignKey(Engine2, unique=True)
Nach dem Login kopieren

Auswahl der richtigen Beziehung

Letztendlich hängt die Wahl zwischen OneToOneField() und ForeignKey() von Ihrem spezifischen Datenmodell und Ihren Anwendungsfällen ab. Wenn Sie eine echte Eins-zu-Eins-Beziehung benötigen, bei der der direkte Zugriff auf ein einzelnes umgekehrtes Objekt unerlässlich ist, wird OneToOneField() empfohlen. Für Situationen, in denen komplexe Abfragen oder eventuelle Beziehungen mit mehreren Objekten auf der „umgekehrten“ Seite erforderlich sind, ist ForeignKey() mit unique=True besser geeignet.

Das obige ist der detaillierte Inhalt vonWann sollte man in Django „OneToOneField()' vs. „ForeignKey(unique=True)' wählen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!