Maison  >  Article  >  développement back-end  >  Quand choisir `OneToOneField()` ou `ForeignKey(unique=True)` dans Django ?

Quand choisir `OneToOneField()` ou `ForeignKey(unique=True)` dans Django ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-07 03:23:02120parcourir

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

Comparaison de OneToOneField() et ForeignKey() de Django

Django propose deux mécanismes principaux pour établir des relations entre les modèles : OneToOneField() et ForeignKey( ). Bien que les deux autorisent des associations individuelles, ils diffèrent par leurs comportements et leurs conséquences.

OneToOneField() et ForeignKey(unique=True)

Essentiellement, OneToOneField(SomeModel) ressemble fonctionnellement à ForeignKey(SomeModel, unique=True). Dans les deux cas, vous imposez une relation unique entre les objets. Cependant, il existe une distinction subtile :

OneToOneField fournit une relation bidirectionnelle, dans laquelle la récupération d'un objet du côté "inverse" renvoie directement l'objet unique correspondant.

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

ForeignKey avec unique=True, en revanche, maintient une relation unidirectionnelle. La récupération d'un objet du côté "inverse" renvoie un QuerySet.

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

Exemple d'illustration

Considérons deux modèles : Car et Engine, où Car utilise OneToOneField() et Car2 utilise ForeignKey(unique=True). L'exécution du code suivant démontre les différences :

# 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>]"

Code modèle pour référence

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)

Choisir la bonne relation

En fin de compte, le choix entre OneToOneField() et ForeignKey() dépend de votre modèle de données spécifique et de vos cas d'utilisation. Si vous avez besoin d'une véritable relation un-à-un où l'accès direct à un seul objet inverse est essentiel, alors OneToOneField() est recommandé. Pour les situations où des requêtes complexes ou d'éventuelles relations multi-objets du côté "inverse" sont nécessaires, ForeignKey() avec unique=True est plus approprié.

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