Maison >développement back-end >Tutoriel Python >Quelle est la principale différence entre `OneToOneField()` et `ForeignKey()` avec `unique=True` dans Django ?

Quelle est la principale différence entre `OneToOneField()` et `ForeignKey()` avec `unique=True` dans Django ?

DDD
DDDoriginal
2024-11-12 13:01:01603parcourir

What is the key difference between `OneToOneField()` and `ForeignKey()` with `unique=True` in Django?

OneToOneField() vs ForeignKey() dans Django

OneToOneField() et ForeignKey() sont deux champs de modèle Django utilisés pour établir des relations entre les modèles. Bien que les deux champs puissent créer une relation individuelle, il existe des différences subtiles dans leur comportement :

OneToOneField()

  • Similitude conceptuelle : similaire à ForeignKey avec unique=True.
  • Relation "Reverse" : renvoie directement un seul objet sur l'autre côté de la relation.

ForeignKey() avec unique=True

  • Différence conceptuelle : Spécifie une relation un-à-un par paramètre unique=True.
  • Relation "Inverse" : renvoie un QuerySet sur le l'autre côté de la relation.

Exemple

Considérons les modèles suivants :

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

# ForeignKey with unique=True example
class Car2(models.Model):
    name = models.CharField(max_length=25)
    engine = models.ForeignKey(Engine2, unique=True)

Dans le shell Python :

# OneToOneField
car = Car.objects.get(name='Audi')
engine = Engine.objects.get(name='Diesel')
print(engine.car)  # Outputs <Car: Audi>

# ForeignKey with unique=True
car2 = Car2.objects.get(name='Mazda')
engine2 = Engine2.objects.get(name='Wankel')
print(engine2.car2_set.all())  # Outputs [<Car2: Mazda>]

La relation "inverse" de OneToOneField (engine.car) renvoie un seul objet (l'instance Car), tandis que ForeignKey avec unique=La relation "inverse" de True (engine2.car2_set.all()) renvoie un QuerySet (une liste de toutes les instances Car2 liées à cette instance Engine2).

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn